CentOS 6.7手动升级gcc g++

废话不说,直接如题。

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" 了

参考文献:
https://www.cnblogs.com/lzpong/p/5755678.html

猜你喜欢

转载自blog.csdn.net/u012414189/article/details/84073677