CentOS 7 升级gcc/g++编译器
gcc的升级必须要使用源码进行升级,也就说,必须要使用源码进行编译才行。我的7.2的CentOS目前自带的gcc是4.8.5的,gcc从4.8之后开始支持C++11,但是鉴于现在C++14、C++17都已经出来了,所以还是把编译器升级一下,才能紧跟发展,尝试使用14/17的新特性。gcc源码下载地址:https://gcc.gnu.org/。
第一步:下载源代码
查了资料步骤上多了几个,重做一下:
首先:
yum -y install texinfo
如果不执行这个命令的话,那么在执行第四步的配置的时候,会出现makeinfo:could not find this command。
从:ftp://ftp.gnu.org/gnu/gcc/gcc-8.2.0/下载源码包:gcc-8.2.0.tar.gz。使用命令:tar -zxvf gcc-8.2.0.tar.gz解压。当然也可以在:https://github.com/gcc-mirror/gcc下载源码。下载过程如下:
选择gcc版本,在Branches这里选择gcc-8这个分支:
接下来点击旁边的Tags,可以选择gcc-8.2.0-Release
第二步:安装依赖库
据说原来升级gcc的时候超级麻烦因为它依赖了mpfr、gmp、mpc 和isl共四个库,它们下载起来也很麻烦,现在事情变得简单了很多, 在gcc目录下执行一次执行以下命令:
./contrib/download_prerequisites #作用是自动下载gcc的4个依赖包
可能会出现如下错误:
[root@CentOs64-7 gcc-8.2.0]# ./contrib/download_prerequisites 2019-01-21 10:38:33 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1] 2019-01-21 10:38:39 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1] 2019-01-21 10:38:44 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1] 2019-01-21 10:38:50 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1] gmp-6.1.0.tar.bz2: OK mpfr-3.1.4.tar.bz2: OK mpc-1.0.3.tar.gz: OK isl-0.18.tar.bz2: OK tar (child): lbzip2: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now error: Cannot extract package from gmp-6.1.0.tar.bz2
这个问题其实就是因为tar解包的时候没有解成功。这是因为机器上没有安装bzip2,使用如下命令安装bzip2:
yum -y install bzip2
安装这个之后,把解压后的目录删了,再重新走一遍上面的过程,这次就OK了,4个依赖包下载成功。
[root@CentOs64-7 gcc-8.2.0]# ./contrib/download_prerequisites 2019-01-21 10:48:24 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1] 2019-01-21 10:48:30 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1] 2019-01-21 10:48:34 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1] 2019-01-21 10:48:39 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1] gmp-6.1.0.tar.bz2: OK mpfr-3.1.4.tar.bz2: OK mpc-1.0.3.tar.gz: OK isl-0.18.tar.bz2: OK All prerequisites downloaded successfully.
如果想要自己安装这些依赖包的话,可以参考这篇博客:(https://blog.csdn.net/yndu_13/article/details/82842408),但是我没有照着这个操作,就是没有验证到底是否行得通……
第三步:配置
然后使用命令:
mkdir build
cd build
进入build目录后,再执行下面的配置命令。
如果你只需要支持C/C++编译器,那么在gcc目录下执行如下配置命令:
../configure --prefix=/usr --enable-multilib --enable-languages=c,c++ -disable-multilib
否则,执行:
../configure --prefix=/usr --enable-multilib
这条命令的作用实际上就是生成合适的Makefile,执行的过程中出现了一个警告:
configure: WARNING: using in-tree isl, disabling version check *** This configuration is not supported in the following subdirectories: gnattools gotools target-libada target-libhsail-rt target-libgfortran target-libbacktrace target-libgo target-libffi target-libobjc target-liboffloadmic (Any other directories should still work fine.)
说明一下,这个警告,我看了很多人的博客,都没有提到过,有的博客倒是把它列出来了,但是却没有给出解决的办法。
配置成功以后,执行命令:
yum groupinstall "Development Tools"
第四步:make
第三步执行无误后,在gcc目录下使用make目录。建议使用单任务make,不要使用多任务,多任务有可能会编译报错。
然而安装失败了……
checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES. make[2]: *** [configure-stage1-zlib] 错误 1 make[2]: 离开目录“/root/gcc-8.2.0” make[1]: *** [stage1-bubble] 错误 2 make[1]: 离开目录“/root/gcc-8.2.0” make: *** [all] 错误 2
先把原来安装的东西都清理一下:
make distclean
这个问题,就是我把执行了一下 yum -y install texinfo,然后把整个过程重新走了一遍,就没有问题了。
第四步
安装,执行命令
make install
等待安装结束后就能正常使用gcc了。现在使用gcc -v 检查版本的话,就是gcc 8.2.0。在make的过程中也有一些警告,目前尚不知这些警告会造成何种影响,这些警告有点儿多,没有逐一记录下来,如果有后来者看到这篇博客,并遇到了和我一样的困扰,并且解决了这个问题,烦请告之,感激不尽。
升级gcc/g++的必要性,现在下载到的CentOS镜像中自带的gcc版本是4.8.5,gcc从4.8开始支持C++11,但是在以后的编码工作中势必会用到C++14、C++17乃至更新的标准下的新特性,既然标准库已经造出了轮子,为什么我们不用呢?而要使用这些新特性,你就必须要获得编译器的支持。
补充:
升级gcc的一个更加简单的做法,但是这个做法的缺点是只支持64位程序而无32位支持。
采用CentOS的一个第三方库SCL(软件选集),SCL可以在不覆盖原系统软件包的情况下安装新的软件包与老软件包共存并且可以使用scl命令切换,不过也有个缺点就是只支持64位的。还有devtoolset-4(gcc 5.2)及之前的版本都已经结束支持,只能通过其他方法安装。
本次升级到gcc8,命令如下:
yum -y install centos-release-scl yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils scl enable devtoolset-8 bash #启动gcc8
你要哪个版本的就把第2条命令中的数字8改成你要的主版本号就可以了。这样升级到的是最新的版本。例如8升级到的是8.2.0而不是8.1。
通过scl命令启动gcc,这个只是暂时的,当你的shell关闭后或者重启就会恢复原来的版本,要想一直使用升级后的版本可以使用如下命令:
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile