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- gcc-8.2.]# ./contrib/download_prerequisites
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1..tar.bz2: OK
mpfr-3.1..tar.bz2: OK
mpc-1.0..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
tar: Error is not recoverable: exiting now
error: Cannot extract package from gmp-6.1..tar.bz2
这个问题其实就是因为tar解包的时候没有解成功。这是因为机器上没有安装bzip2,使用如下命令安装bzip2:
yum -y install bzip2
安装这个之后,把解压后的目录删了,再重新走一遍上面的过程,这次就OK了,4个依赖包下载成功。
[root@CentOs64- gcc-8.2.]# ./contrib/download_prerequisites
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
-- :: URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1..tar.bz2: OK
mpfr-3.1..tar.bz2: OK
mpc-1.0..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[]: *** [configure-stage1-zlib] 错误
make[]: 离开目录“/root/gcc-8.2.”
make[]: *** [stage1-bubble] 错误
make[]: 离开目录“/root/gcc-8.2.”
make: *** [all] 错误
先把原来安装的东西都清理一下:
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--gcc devtoolset--gcc-c++ devtoolset--binutils
scl enable devtoolset- bash #启动gcc8
你要哪个版本的就把第2条命令中的数字8改成你要的主版本号就可以了。这样升级到的是最新的版本。例如8升级到的是8.2.0而不是8.1。
通过scl命令启动gcc,这个只是暂时的,当你的shell关闭后或者重启就会恢复原来的版本,要想一直使用升级后的版本可以使用如下命令:
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile
CentOS 7 升级gcc/g++编译器的更多相关文章
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
原文地址:https://www.cnblogs.com/lzpong/p/5755678.html 我这里是centos7 升级到gcc8.1,过程差不多,参考这篇文章,记录一下. ---原文--- ...
- gcc/g++编译器的安装与说明
gcc/g++编译器的安装与说明 1.gcc/g++编译器的安装 gcc yum install gcc g++ yum install gcc-c++ 2.gcc/g++的作用 将c/c++源代码编 ...
- centos 6升级 GCC 到4.8
centos 6升级 GCC 到4.8 安装最新版本的swoole 提示 pecl install swolle ... GCC 4.8 or later required. 首先想到的时候yum ...
- 通过yum升级gcc/g++至版本4.8.2
最近在坐一个日期处理的问题,需要安装sxtwl模块,但是gcc版本4.7死活也安装不上,最后测试到只能升级gcc版本到4.8才得以解决 [root@123 bin]# gcc -vUsing buil ...
- centos 7升级gcc到10.2.0
安装gcc 由于 Linux 操作系统的自由.开源,在其基础上衍生出了很多不同的 Linux 操作系统,如 CentOS.Ubuntu.Debian 等.这些 Linux 发行版中,大多数都默认装有 ...
- UBUNTU 下如何升级 gcc, g++
正如大家所知道的GCC并不支持"make uninstall". 一种推荐安装方式就是把GCC 安装在你自己指定的一个路径,当你不须要某个GCC版本号的时候你仅仅须要移除相应版本号 ...
- Linux环境下GNU, GCC, G++编译器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012823258/article/details/36890125 一.GNU GNU是" ...
- Linux环境下GNU, GCC, G++编译器(转)
一,GNU GNU是“GNU 's Not Unix”的递归缩写, Stallman宣布GNU应当发音为Guh-NOO(革奴)以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new ...
随机推荐
- __setitem__,__getitem,__delitem__
目录 __setitem__ __getitem__ __delitem__与__delattr__ class Foo: def __init__(self, name): self.name = ...
- Hackintosh
条件:Mac环境(也可在Windows电脑上用虚拟机建立).两只(一只亦可)16G及以上优盘.一块64G以上SSD固态(机械)硬盘.一台待折腾的Windows电脑 1.创建安装盘: ·app stor ...
- 转 载python数据分析(1)-numpy产生随机数
转自:http://blog.csdn.net/jinxiaonian11/article/details/53143141 在数据分析中,数据的获取是第一步,numpy.random 模块提供了非常 ...
- 20180607pip install xxx报错SyntaxError invalid syntax
用pip安装时都要在cmd命令行里启动的,而在python中无法运行.退出python运行环境就再执行pip可以了.而且最好用管理员身份运行cmdC:\WINDOWS\system32>cd D ...
- Ubuntu 解决E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
今天想在ubuntu上配置nodejs的环境.结果用apt install安装软件时出现报错. $ sudo apt-get update 会得到下面错误提示: E: 无法获得锁 /var/lib/a ...
- if __FILE__ == $0 end
if __FILE__ == $0 end __FILE__是一个“具有魔力”的变量,它代表了当前文件名.$0是用于启动程序的文件名.那么代码“if __FILE__ == $0”便意味着检查此文件是 ...
- How To Install and Secure phpMyAdmin on Ubuntu 12.04(MySQL图形管理)
原文参考链接:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-on-ubun ...
- JavaScript30-7 数组的一些基本方法
本次来学习数组的一些方法,之前学习的js数组的方法是在第四课里面(没有写到随笔里面) 之前第四课主要讲的是 filter() ,map() 这次课程主要介绍的是 some()`.`every()`.` ...
- Android 8.0 NotificationChannel 采坑实例
Android O 上Notification的新特性: 通知通道功能 1. 简介: 通知通道功能使开发者管理自己应用的通知成为一个组或者一个通道,用户可以通过通知通道完成设置通知,如:阻止所有通知, ...
- Linux下各文件夹的结构说明及用途介绍(转载)
linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...