centos 升级gcc
最近使用自己的虚拟机编译项目文件,发现报错:/root/yimi/serv_dev_camera_proxy/serv_dev/esb_middleware/output/linux/bin/libboost_locale.so:对‘std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20’未定义的引用/root/yimi/ser
最近使用自己的虚拟机编译项目文件,发现报错:
/root/yimi/serv_dev_camera_proxy/serv_dev/esb_middleware/output/linux/bin/libboost_locale.so:对‘std::__throw_out_of_range_fmt(char const*, ...)@GLIBCXX_3.4.20’未定义的引用
/root/yimi/serv_dev_camera_proxy/serv_dev/esb_middleware/output/linux/bin/libboost_locale.so:对‘__cxa_throw_bad_array_new_length@CXXABI_1.3.8’未定义的引用
这个boost库是已经编译好的so动态库,项目中引用到了这个libboost_locale.so库,按理来说编译的时候不会检查libboost_locale.so内部的东西,这个工程在别的机器也也可以编译成功。开始没有头绪,以为这个库找不到c++运行时库,一阵瞎捣鼓,配置环境变量LD_LIBRARY_PATH,还是不行。然后对比了一下其他能编译这个工程的机器和本机的gcc版本,发现自己的是4.8.5版本,另外的机器是4.9.2。更新了一下gcc版本到最新版本,真的能圆满解决了。
下面是升级gcc教程
只需要三个命令
1、sudo yum install centos-release-scl
2、sudo yum install devtoolset-8-gcc*
3、scl enable devtoolset-8 bash
如果上面三个命令都执行成功,然后执行
gcc -v 查看版本
版本是gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)就大工告成了。
下面是题外话:
如果升级gcc要自己编译源码,不用想,肯定会很麻烦,要找网站找源码,然后找编译教程,编完后可能还要配置各种问题。这个是使用红帽提供的开发工具包devtoolset来管理gcc版本,这样做的好处是随时切换版本,并且可以并存多个版本,不破坏原有gcc环境。
devtoolset对应gcc的版本
1 2 3 4 | devtoolset-3对应gcc4.x.x版本 devtoolset-4对应gcc5.x.x版本 devtoolset-6对应gcc6.x.x版本 devtoolset-7对应gcc7.x.x版本 |
sudo yum install devtoolset-8-gcc*这个命令是按装gcc8.x.x版本,你也可以改一下数字安装对应版本
scl enable devtoolset-8 bash这个命令执行完之后才会切换gcc版本,并且这仅仅在当前bash生效,如果需要永久生效,可以请自行添加环境变量。
想要登陆就自动切换好gcc版本而不用每次都执行那条命令,我试了几种方法,想要知道哪些坑就往下看,下面是可行的方法,即在~/.bashrc 文件添加如下脚本:
#switch gcc version
if [[ $SET_GCC_VER != "true" ]]
then
export SET_GCC_VER="true"
echo "devtoolset enable"
scl enable devtoolset-8 bash
fi
~/.bashrc这个脚本是每次登陆都会执行的脚本,而执行scl enable devtoolset-8 bash 这个命令之后又相当于重新登陆,会再次执行~/.bashrc,而如果没有那些条件判断,这个~/.bashrc会循环调用,那就gg了,还好能使用Ctr+C杀掉进程。以上这个判断如果执行了一次之后会设置SET_GCC_VER这个环境变量,当下一次执行~/.bashrc的时候判断有这个环境变量就不会再次执行scl enable devtoolset-8 bash 了
如果你把scl enable devtoolset-8 bash 这个命令放在启动脚本/etc/rc.local中,我试了也是不行的。
参考文章:
更多推荐
所有评论(0)