文章目录

  • 1 问题原因
    • 1.1 确保编译器支持std::regex
  • 2 解决方法
  • 3 Centos7升级gcc
    • 3.1 安装centos-release-scl
    • 3.2 安装devtoolset
    • 3.3 激活对应的devtoolset
    • 3.4 验证gcc版本
    • 3.5 新安装的gcc/g++路径
    • 3.6 新建软链接替换旧的gcc
  • 4 Cmake指定编译器为新安装的gcc版本
  • 5 参考链接

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 解决方法

  1. 升级Gcc版本到4.9以上
  2. 将Cmake的gcc和g++编译器修改为新安装的gcc和g++版本
  3. 重新编译项目

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.5ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gccmv /usr/bin/g++ /usr/bin/g++-4.8.5ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++gcc --versiong++ --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 ..
-- The C compiler identification is GNU 8.3.1
-- The CXX compiler identification is GNU 8.3.1
-- Check for working C compiler: /opt/rh/devtoolset-8/root/bin/gcc
-- Check for working C compiler: /opt/rh/devtoolset-8/root/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /opt/rh/devtoolset-8/root/bin/g++
-- Check for working CXX compiler: /opt/rh/devtoolset-8/root/bin/g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done

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

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

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

错误,程序没有中断,并正确执行!Bingo!

5 参考链接

  • https://www.cnblogs.com/jixiaohua/p/11732225.html
  • https://blog.csdn.net/xiaoyaozhaohan/article/details/80108546

如果大家有兴趣可以访问我的个站:http://www.stubbornhuang.com,更多干货!

Centos7 编译C++项目错误解决 : terminate called after throwing an instance of ‘std::regex_error‘相关推荐

  1. Linux运行python文件出现以下错误:terminate called after throwing an instance of ‘std::runtime_error‘

    Linux运行python文件出现以下错误:terminate called after throwing an instance of 'std::runtime_error'

  2. 错误:【terminate called after throwing an instance of 'std::logic_err】

    自己写代码的时候,出现了一下提示 terminate called after throwing an instance of 'std::logic_error'what(): basic_stri ...

  3. XGB模型训练报错 terminate called after throwing an instance of ‘std::bad_alloc‘ what()

    背景:需要做XGB模型增量训练,但是因为一些原因没有得到原来的XGB模型,只有dump文件. XGB模型的dump文件是它的树结构存储为一个相对人类好理解的模型文件,但并不能被重新加载进XGB进行增量 ...

  4. 报错信息 terminate called after throwing an instance of ‘std::cad_alloc‘ what():std::bad_alloc

    最近做了一道bfs算法的程序题 输入测试数据后卡在运行框中 然后会产生一个错误信息 第一次见到这样的报错于是记录一下解决过程 terminate called after throwing an in ...

  5. terminate called after throwing an instance of ‘std::runtime_error‘ what(): locale::facet::_S_cre

    在运行程序时出错: terminate called after throwing an instance of 'std::runtime_error'   what():  locale::fac ...

  6. terminate called after throwing an instance of ‘std::runtime_error‘

    terminate called after throwing an instance of 'std::runtime_error' what():  random_device::random_d ...

  7. c++运行时报错terminate called after throwing an instance of ‘std::bad_alloc‘

    程序运行时发生错误 terminate called after throwing an instance of 'std::bad_alloc'what(): std::bad_alloc 代码类似 ...

  8. terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

    运行时报错: terminate called after throwing an instance of 'std::out_of_range' what():  basic_string::sub ...

  9. (已解决)579B但答案仍旧错误terminate called after throwing an instance of ‘ std::bad_array_length‘,

    输入16进制16 ff 10 就会出现如上问题.应该是字符串问题.不过为什么? #include<stdio.h> #include<string.h> char z[17]= ...

最新文章

  1. react 组件样式_如何使用样式化组件为React组件创建视觉变体
  2. Java并发编程-信号量
  3. intellij IDEA debug android app之前执行adb命令
  4. 平均年薪50.8万,这个证书真!香!
  5. Yii AR Model 查询
  6. Atitit.获取approot api 应用根路径 java c#.net php asp
  7. JAVAEE框架之SpringMVC基础
  8. Mind Control CodeForces - 1291C(思维)
  9. [Ogre][地形]OgreTerrain的实现原理分析
  10. 又有无人车数据集开源,2019段加州通勤小视频等你撩 | 资源
  11. oracle sql练习_最方便的在线SQL学习环境——Oracle Live SQL
  12. 调度系统核心算法第一篇-交通管制
  13. echarts柱形图X轴Y轴相关配置
  14. 【20230407】NVIDIA显卡算力、Jetson比较
  15. python爬虫获取图片无法打开或已损坏_Python爬取小姐姐图片
  16. 找不到包 \ 符号,idea中包已经导入,但是运行还是提示找不到包问题
  17. mac桌面壁纸_在Mac上从命令行设置桌面墙纸
  18. Java web15
  19. 【数组】雇佣 K 名工人的最低成本
  20. 组一台创想Ender-3和prusa MK3

热门文章

  1. 相对定位绝对定位固定定位元素的层级
  2. 中金所技术公司-入职金融IT国企之路
  3. 友善之臂arm嵌入式linux系统ftp传输问题
  4. div 绝对定位覆盖
  5. 金圣叹:催人泪下的“生联死对”
  6. Debian9 stretch xfce4桌面开启超时熄屏并锁屏不生效问题分析解决
  7. 如何避免CMDB沦为数据孤岛?
  8. zepto知识点总结
  9. 对称正定矩阵乔里斯基分解法
  10. 使用Telent连接防火墙设备