CentOS 6.7手动升级gcc g++
程序员文章站
2022-05-29 11:49:25
...
废话不说,直接如题。
CentOS里面使用yum直接更新gcc,发现更新到的gcc版本最高只有4.4.7。
但是有的时候,使用某些开源组件(我遇到的是protobuf)会导致编译不成功,提示缺少c11 STL的相关包,google了一下,发现的确是gcc的版本不够高,这种情况只能手动的升级gcc。
下面是详细的手动安装or升级gcc g++的步骤
1、获取安装包,并且解压,这里以升级到gcc-6.1.0升级为例
gcc安装包的链接地址:http://ftp.gnu.org/gnu/gcc
命令:
wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
tar -jxvf gcc-6.1.0.tar.bz2
2、下载编译需要的一些依赖包
下载文件包中刚好有一个脚本文件,运行这个脚本文件可以自动帮我们下载一些依赖包
命令:
cd gcc-6.1.0
./contrib/download_prerequisites
3、建立一个文件目录用于存放编译结果文件的存放
命令:
mkdir gcc-build-6.1.0
cd gcc-build-6.1.0
4、生成一个makefile文件
命令:
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
5、编译
命令:
make -j4
值得注意的是,和其他的编译类似,j4表示的是用cpu4核进行优化编译。
(此步骤非常耗时,我虚拟机耗时近3小时,CPU基本是满的,内存也使用不少)
6、安装
make install
7、查看gcc版本
命令:
gcc -v
升级完成,这个时候查看gcc的版本,可以看到已经有了最新的版本,如果没有可能需要重启系统,然后在查看。
除此之外,源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
所以接下来我们还需要替换动态库,步骤如下:
8、检查当前动态库
命令:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
9、查找最新版gcc编译生成的最新动态库
find / -name "libstdc++.so*"
将上面的最新动态库libstdc++.so.6.0.22复制到/usr/lib64目录下
cd /usr/lib64
cp /root/Desktop/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
10、删除原来的软链接
rm -rf libstdc++.so.6
11、将默认库的软链接指向现在最新的动态库
ln -s libstdc++.so.6.0.22 libstdc++.so.6
12、重启,并重新查找动态库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 输出有"GLIBCXX_3.4.21" 了