默认情况下,CentOS7 预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编译器的版本进行升级,比如安装最新的Mariadb 10的时候,就需要使用高版本的gcc,具体升级过程如下:
一、下载镜像
首先可以去gnu的官网https://gcc.gnu.org/mirrors.html
下载新版本的安装包。
但是gnu官网并没有提供国内的镜像地址,所以我们可以退而求其次,在国内阿里的gnu镜像站https://mirrors.aliyun.com/gnu
进行下载
二、安装GMP、MPFR、MPC
下载之后上传至Linux准备安装,如果此时直接进行编译安装,此时gcc会报出错误:configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
也就是说安装该版本的GCC 需要GMP 版本 >= 4.2 MPFR版本 >= 2.4.0 MPC版本 >= 0.8.0
这3个依赖缺一不可,并且这3个依赖之间也具有相互依赖关系,即gmp独立安装,mpfr依赖于gmp,mpc依赖于gmp和mpfr,虽然执行gcc目录下的:./contrib/download_prerequisites
可以解决依赖问题,但是一般国内下载速度比较慢,所以这里手动安装如下三个依赖。
三个依赖的具体版本可以自行选择,下载地址如下:
gmp:http://ftp.gnu.org/gnu/gmp/
mpfr(GNU镜像):http://ftp.gnu.org/gnu/mpfr/ 或者官网: http://www.mpfr.org/mpfr-current/
首先安装gmp,命令如下:
tar -xvzf gmp-5.0.1.tar.gz
cd gmp-5.0.1/
mkdir temp
cd temp/
../configure --prefix=/usr/local/gmp-5.0.1
make
make install
注意:编译时建议指定安装位置,以便后面加载依赖,这里是/usr/local
下。
然后安装mpfr,命令如下:
tar -xvzf mpfr-3.1.5.tar.gz
cd mpfr-3.1.5/
mkdir temp
cd temp/
../configure --prefix=/usr/local/mpfr-3.1.5 --with-gmp=/usr/local/gmp-5.0.1
make
make install
到这里mpfr安装完毕,并且必须添加--with-gmp
导入gmp依赖,如果不加这个参数也会安装成功,但是后面安装GCC会报一个内部依赖的错误,如果这里不加会很麻烦,然后再安装mpc,命令如下:
tar -xvzf mpc-1.0.3.tar.gz
cd mpc-1.0.3/
mkdir temp
cd temp/
../configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-5.0.1 --with-mpfr=/usr/local/mpfr-3.1.5
make
make install
同样一定要加上依赖的参数,现在mpc也安装完毕,然后执行 vim /etc/profile
编辑环境变量配置文件,直接在文件最后添加一行下面的变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-5.0.1/lib:/usr/local/mpfr-3.1.5/lib
上面的路径要和实际安装时编译的路径一致,保存并退出后,执行 source /etc/profile
使环境变量生效
三、安装gcc
安装好上述三个依赖包后就可以开始安装gcc了,安装过程如下:
tar -jxvf gcc-4.9.3.tar.bz2
cd gcc-4.9.3/
mkdir output
cd output/
../configure --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-5.0.1 --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3
然后开始编译并且安装:
make -j4
sudo make install
查看安装
ls /usr/local/bin | grep gcc
重启,查看gcc版本
gcc -v
源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似 /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.24' not found
的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
运行以下命令检查动态库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
从输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。
执行以下命令,查找编译gcc是生成的最新的动态库。
find / -name "libstdc++.so*"
将生成的最新的动态库 libstdc++.so.6.0.24
复制到 /usr/lib64
目录下
cd /usr/lib64
cp /usr/local/lib64/libstdc++.so.6.0.24 ./
删除原来的软连接:
rm -rf libstdc++.so.6
将默认库的软连接指向最新动态库:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
默认动态库升级完成。重新运行以下命令检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 输出有"GLIBCXX_3.4.24" 了