• 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

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

C++ 发布于2020-12-16 阅读 6,168次 0次评论 1次点赞 本文共2472个字,阅读需要7分钟。

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.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 ..
-- 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 参考链接

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:Centos7 编译C++项目错误解决 : terminate called after throwing an instance of ‘std::regex_error’

原文链接:https://www.stubbornhuang.com/1023/

发布于:2020年12月16日 14:27:45

修改于:2023年06月26日 22:01:22

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
Modern OpenGL - GLSL着色语言4:GLSL中的数据存储限制符
OpenGL可编程渲染管线
下一篇
资源分享 - OpenGL编程指南(原书第7版)- OpenGL红宝书 中文PDF下载
计算几何与计算机图形学资源
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号