关于如何升级gcc版本及相关的标准库问题
@[toc]
第一大步:先升级gcc
(这里只是举个例子,你们操作时把例子中gcc版本换成你们自己下载的gcc版本)
- 先找到自己想要的gcc版本,可以在下面链接中找:
gcc版本库 - 获取安装包并解压:
wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
注意,如果自己下载的gcc压缩包不一定是以.tar.bz2结尾,自己找对应的解压方式
tar -jxvf gcc-6.1.0.tar.bz2
- 下载供编译需求的依赖项 这个神奇的脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。
cd gcc-6.1.0
./contrib/download_prerequisites
运行这个脚本要在联网状态下完成,因为要下载配置,安装依赖库,这也需要时间,网络不好的时候会是一个较慢长的等待时间
4.建立一个目录供编译出的文件存放
mkdir gcc-build-6.1.0
cd gcc-build-6.1.0
5.生成Makefile文件
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
6.编译
make -j4
-j4选项是make对多核处理器的优化,如果不成功请使用make
(注意:此步骤非常耗时,最好在网络良好的情况下升级,我虚拟机耗时近3小时; 实体机近80分钟,CPU基本是满的,内存也使用不少)
7.安装
make install
(安装需要root权限)
查看安装(这一步可以省略,不同的用户,位置可能不同)
ls /usr/local/bin | grep gcc
8.重启然后查看gcc版本
gcc -v
9.测试
在编译时最好加上-std=C++11选项
通过上面的步骤就可以完成对g++和gcc的升级,过程比较耗时,自己合理安排
第二大步:更新标准库(libstdc++.so.6)
[root@localhost ~]# ./a.out
./a.out: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
如果出现这个错误,原因是你升级了gcc的版本之后却没有用生成的动态库替换老版本的动态库, 这样在程序编译运行的时候偶尔就会遇到上面所述的问题。
-
注意:网上的有一些教程在解决这个问题的时候会有这种方法,就是在网上找一个 libstdc++.so.6.0.22,然后使用这个来生成软连接,这样是不行的,一定要用自己编译的动态库(⚠️),否则当你重启电脑的时候,你的CentOS桌面系统就会出问题,图形化界面都无法操作,就是因为你使用了一个来路不明的动态库导致的,解决办法就是使用自己编译的动态库或者系统自带的动态库来生成软连接,这样重启之后系统就会恢复了。
-
解决方法:
自己按照我的例子来改就行
查看自己标准库中的GLIBCXX版本,首先要比报错的GLIBCXX版本高才行,
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
- root模式下执行以下命令,查找编译gcc时生成的最新动态库:
find / -name "libstdc++.so*"
我的运行结果:(注意要找自己编译升级gcc对应的库)
记住,这是我的经过升级后的gcc标准库的路径,后面会用到
/home/wolf/gcc-9.1.0/gcc-build-9.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.26
4.现在自己看报错信息,看那个目录下报的错,我这里是
即在这个目录下包的错
/home/wolf/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/
5.进入到报错的目录里面
cd /home/wolf/.VimForCpp/vim/bundle/YCM.so/el7.x86_64/
6.拷贝上面提到的经过自己升级gcc后编译的标准库到当前目录
cp /home/wolf/gcc-9.1.0/gcc-build-9.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.26 ./
或者(怎么拷贝就看自己的心情)
7.删除原来软连接:
rm -rf libstdc++.so.6
8.将默认库的软连接指向最新动态库:
ln -s libstdc++.so.6.0.26 libstdc++.so.6
9.最后最后,自己去测试自己的程序,
评论区