CentOS 7作为一款经典的企业级Linux发行版,默认搭载的GCC版本是4.8.5。这个版本发布于2013年,距今已有近十年历史。对于现代软件开发来说,这个编译器版本已经显得力不从心。我在实际项目中就遇到过不少需要更高版本GCC才能编译的软件包,比如某些需要C++14/17标准支持的库,或者依赖新版编译器优化特性的高性能计算项目。
GCC 8作为2018年发布的稳定版本,带来了诸多重要改进:
使用SCL源安装GCC 8的最大优势在于:
SCL(Software Collections)是专为RHEL/CentOS设计的软件集合方案,它允许我们在不修改系统默认环境的情况下安装和使用新版软件。我推荐使用阿里云的镜像源,速度更快更稳定。
创建新的repo文件:
bash复制sudo tee /etc/yum.repos.d/CentOS-SCLo-scl.repo << 'EOF'
[centos-sclo-scl]
name=CentOS-7 - SCLo scl
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-scl-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF
这里有几个关键点需要注意:
sclo和sclo-rh两个仓库,前者包含基础工具链,后者包含更多开发工具添加完源之后,建议先更新yum缓存:
bash复制sudo yum makecache fast
这个命令会让yum重新建立软件包索引,通常只需要几秒钟就能完成。如果遇到网络问题,可以尝试更换其他镜像源,比如腾讯云或华为云的镜像。
在安装之前,我们可以先查看SCL源提供了哪些GCC版本:
bash复制yum list available devtoolset-\*
你会看到类似这样的输出:
code复制Available Packages
devtoolset-7.x86_64
devtoolset-8.x86_64
devtoolset-9.x86_64
devtoolset-10.x86_64
devtoolset-11.x86_64
每个devtoolset对应一个GCC主要版本:
对于大多数项目来说,GCC 8是一个稳定且功能完善的选择。安装命令如下:
bash复制sudo yum install -y devtoolset-8-toolchain
这个devtoolset-8-toolchain元包会自动安装以下组件:
整个安装过程大约需要下载200MB左右的软件包,具体时间取决于你的网络速度。安装完成后,所有文件都会被放在/opt/rh/devtoolset-8/目录下,不会影响系统默认的/usr/bin中的工具链。
安装完成后,GCC 8并不会立即生效。这是SCL的设计特点,允许我们按需切换不同版本的开发环境。启用GCC 8最简单的方法是:
bash复制scl enable devtoolset-8 bash
这个命令会启动一个新的bash shell,在这个shell中:
gcc --version会显示8.3.1如果某个项目长期需要使用GCC 8,可以将以下内容添加到用户的~/.bashrc文件中:
bash复制source /opt/rh/devtoolset-8/enable
这样每次登录时都会自动启用GCC 8环境。需要注意的是,这种方式只对当前用户有效,不会影响其他用户或系统服务。
无论采用哪种启用方式,都可以通过以下命令验证当前使用的GCC版本:
bash复制gcc --version
正确的输出应该是:
code复制gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
Copyright (C) 2018 Free Software Foundation, Inc.
除了基本的工具链,devtoolset-8还提供了许多有用的开发工具:
bash复制sudo yum install -y devtoolset-8-gdb devtoolset-8-valgrind devtoolset-8-systemtap
这些工具对于调试和性能分析非常有用:
SCL最强大的功能之一就是支持多个GCC版本共存。比如你可以同时安装GCC 8和GCC 10:
bash复制sudo yum install -y devtoolset-8-toolchain devtoolset-10-toolchain
然后根据需要切换:
bash复制# 切换到GCC 8环境
scl enable devtoolset-8 bash
# 切换到GCC 10环境
scl enable devtoolset-10 bash
如果你需要在脚本中使用特定版本的GCC,可以这样写:
bash复制#!/bin/bash
source /opt/rh/devtoolset-8/enable
# 后续的编译命令都会使用GCC 8
make
有时可能会遇到类似这样的错误:
code复制Error: Package X conflicts with Y
解决方法通常是先安装基础依赖:
bash复制sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-8
如果提示scl: command not found,说明没有安装scl-utils包:
bash复制sudo yum install -y scl-utils
某些情况下可能需要手动指定头文件路径:
bash复制export C_INCLUDE_PATH=/opt/rh/devtoolset-8/root/usr/include
export CPLUS_INCLUDE_PATH=/opt/rh/devtoolset-8/root/usr/include/c++/8
为了获得最佳编译性能,可以启用并行编译:
bash复制export MAKEFLAGS="-j$(nproc)"
这个设置会让make使用所有可用的CPU核心进行编译,大幅提升大型项目的编译速度。