合 使用SCL升级CentOS、RHEL、Anolis系列OS的gcc版本
CentOS 7
、BigCloud 7
以及Anolis 7
等系列OS
的默认gcc
版本为4.8.5
,有时编译程序或者驱动源码需要更高版本的gcc
,本文以升级至8.3.1
版本为例,仅仅需要分别执行下面几条命令即可,无需手动下载源码编译。
一、查看默认gcc版本
分别查看CentOS 7
、BigCloud 7
以及Anolis 7
等系列OS
的默认gcc
版本,查询结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #CentOS 7.9平台gcc默认版本 [wz@localhost ~]$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [wz@localhost ~]$ [wz@localhost ~]$ gcc -v 使用内建 specs。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper 目标:x86_64-redhat-linux 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux 线程模型:posix gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) #BigCloud 7.6平台gcc默认版本 [root@localhost ~]# cat /etc/redhat-release BigCloud Enterprise Linux release 7.6.1905 (Core) [root@localhost ~]# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) #Anolis 7.9平台gcc默认版本 [root@localhost ~]# cat /etc/anolis-release Anolis OS release 7.9 [root@localhost ~]# gcc -v 使用内建 specs。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-redhat-linux/4.8.5/lto-wrapper 目标:aarch64-redhat-linux 配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.openanolis.cn --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-aarch64-redhat-linux/cloog-install --enable-gnu-indirect-function --build=aarch64-redhat-linux 线程模型:posix gcc 版本 4.8.5 20150623 (Anolis 4.8.5-44.0.1) (GCC) |
二、升级gcc版本
网上有很多博客会教我们通过gcc
源码进行编译,随后进行安装,从而升级到我们想要的版本,但是这种方法小编也进行了尝试,结果在我的机器上始终编译报错,而且根本不知道问题出在哪里,这种方式实施的过程中在不同的平台及机器可能遇见各种各样的问题,比较麻烦且容易出错。
因此,本文我们采用CentOS
的一个第三方库SCL
(软件选集)来进行gcc
版本的升级,SCL
可以在不覆盖原系统软件包的情况下安装新的软件包与老软件包共存并且可以使用scl
命令切换,不过也有个缺点就是只支持64位的。
Software collections(SCLs)是一个Linux软件多版本共存的解决方案,适用于RHEL/CentOS/Fedora
。SCL不修改已安装的软件版本,也不会与其产生冲突。SCL
的创建就是为了给 RHEL/CentOS
用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱。
1、安装scl源
首先,要解决的第一个问题就是 yum 源的问题。CentOS 7 最晚在2024年6月30后停止更新维护,在此之前在 CentOS 7 可以通过 yum 直接安装 SCL 源基本都是可以正常使用的。
1 2 3 4 5 6 7 8 9 10 | [root@localhost ~]# rpm -ivh https://cbs.centos.org/kojifiles/packages/centos-release-scl-rh/2/3.el7.centos/noarch/centos-release-scl-rh-2-3.el7.centos.noarch.rpm 获取https://cbs.centos.org/kojifiles/packages/centos-release-scl-rh/2/3.el7.centos/noarch/centos-release-scl-rh-2-3.el7.centos.noarch.rpm 准备中... ################################# [100%] 正在升级/安装... 1:centos-release-scl-rh-2-3.el7.cen################################# [100%] [root@localhost ~]# rpm -ivh https://cbs.centos.org/kojifiles/packages/centos-release-scl/2/3.el7.centos/noarch/centos-release-scl-2-3.el7.centos.noarch.rpm 获取https://cbs.centos.org/kojifiles/packages/centos-release-scl/2/3.el7.centos/noarch/centos-release-scl-2-3.el7.centos.noarch.rpm 准备中... ################################# [100%] 正在升级/安装... 1:centos-release-scl-2-3.el7.centos################################# [100%] |
安装完成后,会默认在 /etc/yum.repos.d 下生成 2 个 repo 源文件:
1 2 3 | [root@localhost ~]# ls -l /etc/yum.repos.d/ | grep -i scl -rw-r--r-- 1 root root 998 12月 11 2018 CentOS-SCLo-scl.repo -rw-r--r-- 1 root root 971 10月 29 2018 CentOS-SCLo-scl-rh.repo |
- CentOS-SCLo-scl.repo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # CentOS-SCLo-sclo.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more # information [centos-sclo-sclo] name=CentOS-7 - SCLo sclo # baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/sclo/ mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-sclo gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-sclo-testing] name=CentOS-7 - SCLo sclo Testing baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/sclo/ gpgcheck=0 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-sclo-source] name=CentOS-7 - SCLo sclo Sources baseurl=http://vault.centos.org/centos/7/sclo/Source/sclo/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-sclo-debuginfo] name=CentOS-7 - SCLo sclo Debuginfo baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo |
- CentOS-SCLo-scl-rh.repo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # CentOS-SCLo-rh.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more # information [centos-sclo-rh] name=CentOS-7 - SCLo rh #baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/rh/ mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-rh-testing] name=CentOS-7 - SCLo rh Testing baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/rh/ gpgcheck=0 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-rh-source] name=CentOS-7 - SCLo rh Sources baseurl=http://vault.centos.org/centos/7/sclo/Source/rh/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo [centos-sclo-rh-debuginfo] name=CentOS-7 - SCLo rh Debuginfo baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo |
随后,更新 yum 源的缓存:
1 2 | [root@localhost ~]# yum clean all [root@localhost ~]# yum makecache |
2、安装centos-release-scl与centos-release-scl-rh
1 | [root@localhost ~]# yum install centos-release-scl centos-release-scl-rh |
3、安装devtoolset工具
devtoolset
本身也有不同的版本,因为我们想要将gcc
升级到8.3.1
,所以这里我们安装的是 devtoolset-8-gcc
。
1 | [root@localhost ~]# yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils |
如果想安装7.x
版本的,就改成devtoolset-7-gcc
,以此类推:
1 | [root@localhost ~]# yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils |
全部文件都会被安装在/opt/rh/
目录下,如下:
1 2 3 4 | [root@localhost ~]# ls -l /opt/rh/ 总用量 0 dr-xr-xr-x 3 root root 32 8月 31 14:23 devtoolset-7 dr-xr-xr-x 3 root root 32 8月 31 14:26 devtoolset-8 |
另外,我们可以用SCL
来管理软件集,如安装gcc
,首先查看可安装的版本:
1 2 3 4 5 6 7 8 9 10 11 12 | [root@localhost ~]# yum list dev*gcc 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile * centos-sclo-rh: mirrors.bfsu.edu.cn * centos-sclo-sclo: mirrors.bfsu.edu.cn * epel: mirrors.bfsu.edu.cn 已安装的软件包 devtoolset-7-gcc.aarch64 7.3.1-5.16.el7 @centos-sclo-rh devtoolset-8-gcc.aarch64 8.3.1-3.2.el7 @centos-sclo-rh 可安装的软件包 devtoolset-10-gcc.aarch64 10.2.1-11.2.el7 centos-sclo-rh devtoolset-9-gcc.aarch64 9.3.1-2.2.el7 centos-sclo-rh |
随后,即可用选择合适的版本安装。