centos 7编译出现 cmake:The CXX compiler identification is unknown

  1. 1问题原因

Centos7默认的gcc版本是4.8.3,虽然对C++11的一些新特性提供了支持,但是对C++11的正则表达式好像只写了头文件,没有提供具体的实现????!Wtf!
因为在cmake编译项目的时候整个项目可以正确的编译成功,但是一旦运行就会出现

terminate called after throwing an instance of 'std::regex_error'

导致程序崩溃。

  1. 1 确保编译器支持std::regex

如果你的编译器是GCC-4.9.0或者VS2013以下版本,请升级后,再使用。我之前使用的C++编译器,是GCC 4.8.3,有regex头文件,但是GCC很不厚道的没有实现,语法完全支持,但是库还没跟上,所以编译的时候是没有问题的,但是一运行就会直接抛出异常,非常完美的一个坑有木有!具体错误如下:

terminate called after throwing an instance of 'std::regex_error'
what(): regex_error
Aborted (core dumped)

如果你也遇到了这个问题,请不要先怀疑自己,GCC这一点是非常坑爹的!!!我在这个上面浪费了半天的时间才找了出来。所以在尝鲜C++的正则表达式之前,请升级你的编译器,确保你的编译器支持它

参考:https://zhuanlan.zhihu.com/p/47370556

2 解决方法
升级Gcc版本到4.9以上
将Cmake的gcc和g++编译器修改为新安装的gcc和g++版本
重新编译项目
3 Centos7升级gcc
3.1 安装centos-release-scl
sudo yum install centos-release-scl

3.2 安装devtoolset
注意,如果想安装7.版本的,就改成devtoolset-7-gcc,以此类推

sudo yum install devtoolset-8-gcc*

3.3 激活对应的devtoolset
激活对应的devtoolset,所以你可以一次安装多个版本的devtoolset,需要的时候用下面这条命令切换到对应的版本

scl enable devtoolset-8 bash

3.4 验证gcc版本
gcc -v
显示为 gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)

需要注意的是:这条激活命令只对本次会话有效,重启会话后还是会变回原来的4.8.5版本,要想随意切换可按如下操作

安装的devtoolset是位于 /opt/sh 目录之下,每个版本的目录下面都有个 enable 文件,如果需要启用某个版本,只需要执行

source ./enable

所以要想切换到某个版本,只需要执行:

source /opt/rh/devtoolset-8/enable

可以将对应版本的切换命令写个shell文件放在配了环境变量的目录下,需要时随时切换,或者开机自启。

3.5 新安装的gcc/g++路径
gcc:

/opt/rh/devtoolset-8/root/bin/gcc
g++:

/opt/rh/devtoolset-8/root/bin/g++
3.6 新建软链接替换旧的gcc
旧的gcc是运行的 /usr/bin/gcc,所以将该目录下的gcc/g++替换为刚安装的新版本gcc软连接,免得每次enable

mv /usr/bin/gcc /usr/bin/gcc-4.8.5

ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc

mv /usr/bin/g++ /usr/bin/g++-4.8.5

ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

gcc --version

g++ --version

4 Cmake指定编译器为新安装的gcc版本
将Cmake默认编译器修改为新安装的编译器,执行以下命令:

export CC=/opt/rh/devtoolset-8/root/bin/gcc
export CXX=/opt/rh/devtoolset-8/root/bin/g++

即可将Cmake的默认编译器修改为gcc 8.3.1,

重新使用:

cmake ..
编译项目,出现以下结果:

[root@localhost build]# cmake ..
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find HWLOC (missing: HWLOC_LIBRARY HWLOC_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
  cmake/FindHWLOC.cmake:25 (find_package_handle_standard_args)
  src/backend/cpu/cpu.cmake:30 (find_package)
  src/backend/backend.cmake:1 (include)
  CMakeLists.txt:44 (include)

发现目前Cmake正在使用gcc8.3.1编译项目。

在cmake之后重新使用make编译项目,发现不再出现:

The CXX compiler identification is unknown

linux:The CXX compiler identification is unknown相关推荐

  1. CMake问题:The CXX compiler identification is unknown

    CMake问题:The CXX compiler identification is unknown CMake version: 3.7.0rc1 or high Visual Studio 201 ...

  2. 在aarch64-himix100-linux-gcc下cmake报错(The C compiler identification is unknown)

    项目场景: 华为好望角AI摄像头C系列的算法移植过程中,遇到cmake报错 问题描述: gcc: aarch64-himix100-linux-gcc CMakeLists.txt文档: cmake_ ...

  3. 报错 The CUDA compiler identification is unknown;No CMAKE_CUDA_COMPILER could be found.

    在cmake的编译过程中,可能会报找不到cuda编译器的错误,如下 -- The CUDA compiler identification is unknown CMake Error at CMak ...

  4. CLion:The C compiler identification is unknown, CMake Error;Cygwin的安装配置方法

    错误地方:File | Settings | Build, Execution, Deployment | Toolchains. 主要是CMake安装错误,导致无法进行调试 解决办法: 一. 自己下 ...

  5. ninja Compiling the C compiler identification source file CMakeCCompilerId.c failed

    Compiling the C compiler identification source file "CMakeCCompilerId.c" failed 同时,控制台也报错: ...

  6. 重装解决一切 Linux:unknown filesystem

    1问题 近期虚拟机的Linux系统出错了,开机显示unknown filesystem,尝试解决,失败. 按照教程来,我遇到了下面的问题,ls查找了所有分区,都是显示错误. 经本人查找网络资源,发现并 ...

  7. Linux:获取线程的PID(TID、LWP)的几种方式

    Linux:获取线程的PID(TID.LWP)的几种方式 在 Linux C/C++ 中通常是通过 pthread 库进行线程级别的操作. 在 pthread 库中有函数: pthread_t pth ...

  8. 虚拟机CentOS6.5修改静态IP(NAT模式)+报错:Bringing up interface eth0:  Error: Unknown connection

    上一篇说到CentOS已经获取到动态ip,可以通过远程工具连接到Linux. 但是存在新的问题,每次重启虚拟机的Linux时,都会分配一次ip,导致工具连接的时候每次都要输入一次ip,而且运行工程的时 ...

  9. linux bin命令解释,Linux:“awk”命令的妙用

    原标题:Linux:"awk"命令的妙用 导读awk是一个强大的文本分析工具,简单来说awk就是把文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理 ...

  10. linux开终端失败,Linux:终端提示符 (prompt) 不如期生效原因

    原标题:Linux:终端提示符 (prompt) 不如期生效原因 前言 先来简单介绍下, prompt是什么鬼? 顾名思义就是提示符的意思, 看起来和我们遥远, 但实际上只要是每个接触 shell的童 ...

最新文章

  1. 你不知道的那些“XX即服务”
  2. 快夸我!我把SpringBoot项目从18.18M瘦身到0.18M!
  3. Objective-C语法之KVC使用 有图有真相
  4. nestjs连接远程mysql_Nestjs 链接mysql
  5. std::setprecision、std::ios::fixed使用说明
  6. taskkill无法终止进程 拒绝访问_解决删除文件时,提示无法删除的问题
  7. 算法题存档20190127
  8. Kubernetes通过一行shell命令给pod中的zk节点添加权限
  9. 60-60-020-API-Kafka Java consumer动态修改topic订阅
  10. [Linux系统] VMware克隆CentOS7,解决网络配置问题
  11. 深度学习入门笔记(五):神经网络的学习
  12. 用html做工资查询登陆页面,薪资筛选页面.html
  13. 在Windows 10中打开PowerShell的9种方法
  14. 一瓶可乐有多重?实战梅特勒托利多PS60串口通信开发
  15. ARM64+树莓派4b+JLINK仿真器实验环境搭建指南
  16. VSCode远程连接报错
  17. django arya插件对数据库操作使用,reverse发娘解析url的使用
  18. 强哥带你零基础学java-03运行第一个java程序
  19. 手机电视入网难题将不了了之
  20. 正弦波产生电路_文氏桥振荡

热门文章

  1. 【opencv-python】 cv2.subtract(...)图片减法
  2. 元宇宙:不透明面纱下的“康德主义”
  3. Reactjs源码分析
  4. android-player 本地服务器联调
  5. 第2篇,到底什么是互联网思维?
  6. 互联网思维之迭代思维
  7. 【方法论】时间管理矩阵(Time Management Matrix )-给事情排序,列好1234再执行吧!
  8. .net rdlc 自定义函数把数字转换为大写中文
  9. sketch和zeplin
  10. 华为手机真机测试问题 The application could not be installed: INSTALL_FALLED_INTERNAL_ERROR