CentOS7.6升级gcc版本
1. 前言
在进行一个 Python 项目开发时,需要使用 SQLAlchemy 这一 ORM(对象关系映射)库。SQLAlchemy 在某些异步环境下(如 gevent)会依赖 greenlet 协程库。greenlet 的安装通常涉及 C 扩展的编译,这要求系统具备较新版本的 GCC(GNU Compiler Collection)编译工具链。在 CentOS/RHEL 7.x 等发行版上,系统默认预装的 GCC(例如 4.8.5)版本过低,无法满足编译需求,因此产生了升级 GCC 的需求。
2. 升级 GCC 的两种主流方式
根据技术实践和社区经验,在 Linux 系统中升级 GCC 主要有两种主流的实现路径,二者在原理、适用场景和操作复杂度上存在显著差异,您可根据自身的系统环境、网络条件及具体需求进行选择。
2.1 方式一:通过源码编译安装
这是一种最基础、最通用的方法,适用于几乎所有 Linux 发行版。其核心逻辑是手动下载指定版本的 GCC 源码,连同其依赖库(如 GMP、MPFR、MPC、ISL)一同编译并安装到系统目录中。
2.1.1 主要流程
- 下载 GCC 源码:从 GNU 官方镜像站(如 http://ftp.gnu.org/gnu/gcc/ )下载所需版本的源码压缩包,例如 gcc-8.3.0.tar.gz 。
- 解压并准备依赖:解压源码包并进入目录。通常需要先安装 GMP、MPFR、MPC、ISL 等依赖库。最便捷的方法是执行源码包中的 ./contrib/download_prerequisites 脚本,它会自动下载并配置这些依赖。如果因网络问题脚本失败,则需要根据脚本内容手动下载指定版本的依赖包,解压到 GCC 源码目录下,并创建相应的软链接(例如 ln -sf gmp-6.1.0 gmp)。
- 配置与编译:建议在 GCC 源码目录外创建一个独立的 build 目录进行编译,以避免污染源码。在该 build 目录下执行配置命令,例如 …/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib ,然后使用 make -j4 (数字 4 代表并行编译的线程数,可根据系统 CPU 核心数调整以加快速度)进行编译,此过程可能耗时 40 分钟到数小时。
- 安装与验证:编译完成后,执行 sudo make install 进行安装。安装后,使用 gcc -v 命令验证新版本是否生效。
2.1.2 优缺点分析
- 优点:可以自由选择任何已发布的 GCC 版本进行安装,完全不受发行版软件仓库的版本限制。
- 缺点:
- 过程繁琐:需要手动处理所有依赖,过程长,容易出错。
- 耗时极长:编译过程可能持续数小时。
- 无法共存:安装后直接覆盖系统原有的 GCC,难以回退或与旧版本共存。
- 潜在库冲突:源码编译安装的 GCC 其附带的 libstdc++.so.6 动态库可能与系统默认库版本不一致。如果未手动更新系统的动态链接库(如将 /usr/lib64/libstdc++.so.6 软链接指向新版本库),在运行依赖新版本 C++ 标准库的程序时,可能会遇到 GLIBCXX 版本未找到的错误,例如 GLIBCXX_3.4.20 not found 。
2.2 方式二:通过软件集(SCL/Devtoolset)安装
这是针对 CentOS、RHEL 及其衍生系统(如 Rocky Linux)的推荐方法。它通过红帽官方维护的 Software Collections (SCL) 仓库来安装高版本的开发者工具集(Devtoolset),从而实现 GCC 的快速升级和多个版本共存。
2.2.1 主要流程
- 安装 SCL 仓库:首先执行 sudo yum install centos-release-scl 来启用 SCL 软件源。
- 安装指定版本的 Devtoolset:SCL 提供了多个版本的开发工具集,例如:
- devtoolset-6 对应 GCC 6.3
- devtoolset-7 对应 GCC 7.3
- devtoolset-8 对应 GCC 8.3
- devtoolset-9 对应 GCC 9.3 安装命令为 sudo yum install devtoolset-7 -gcc devtoolset-7-gcc-c++ devtoolset-7 -binutils (以 devtoolset-7 为例)。
- 启用新版本 GCC:安装后,新版本的 GCC 并不会直接覆盖系统默认版本,而是安装在 /opt/rh/ 目录下。启用方法有两种:
- 临时启用:在当前终端会话中执行 scl enable devtoolset-7 bash 启动一个新的 bash 子 shell,或执行** source /opt/rh/devtoolset-7/enable 。退出当前 shell 后即恢复为系统原版本。
- 永久启用:将 source /opt/rh/devtoolset-7/enable 添加到用户的 ~/.bashrc 或系统的 /etc/profile 文件中,这样每次打开终端都会自动启用高版本 GCC。
- 验证:启用后,使用 gcc -v 检查版本是否已切换。
2.2.2 优缺点分析
- 优点:
- 安装简便:通过包管理器自动解决所有依赖,安装速度快。
- 版本共存:支持多个 GCC 版本并存,可按需灵活切换,完全不影响系统原有软件。
- 环境隔离:工具集安装在 /opt/rh/ 下,对系统整体环境影响小。
- 缺点:
- 版本受限:可选的 GCC 版本受 SCL 仓库更新的限制,通常无法获取到最新的上游版本。
- 平台依赖:此方法主要适用于 CentOS/RHEL 系列发行版,在其他发行版(如 Ubuntu/Debian)上不适用。
3. 通过软件集(SCL/Devtoolset)安装详细步骤与问题记录
在使用 Devtoolset 方法进行 GCC 升级的实际操作中,可能会遇到一些因系统环境或软件源导致的问题,以下为基于 CentOS 7.6 的详细操作步骤与问题解决记录。
3.1 安装 SCL 仓库
sudo yum install centos-release-scl
此命令用于安装并启用 SCL 软件源。
3.2 更新 SCL 软件源配置
由于 CentOS 7.6 官方源较旧,可能不包含所需的 devtoolset-9 等包,需要手动配置指向可用的仓库镜像。通常可以通过创建或修改以下两个仓库配置文件来实现:
# 创建并编辑第一个仓库文件 (scl)
sudo tee /etc/yum.repos.d/CentOS-SCLo-scl.repo << 'EOF'
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=http://mirrors.cloud.aliyuncs.com/centos/7/sclo/$basearch/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF
# 创建并编辑第二个仓库文件 (scl-rh) - 这个包含 devtoolset
sudo tee /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo << 'EOF'
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=http://mirrors.cloud.aliyuncs.com/centos/7/sclo/$basearch/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
EOF
重要说明:本例中使用了阿里云镜像的内网地址 mirrors.cloud.aliyuncs.com 。如果你是阿里云 ECS 用户,使用此地址访问速度更快且不产生公网流量。若需切换为普通的公网镜像,可将其改为 mirrors.aliyuncs.com 。
3.3 刷新 Yum 缓存并验证软件包
# 清除旧的缓存数据并重建缓存
sudo yum clean all
sudo yum makecache
# 针对性地搜索验证 centos-sclo-rh 仓库中的 devtoolset-9 相关包
sudo yum list available --disablerepo="*" --enablerepo="centos-sclo-rh" "devtoolset-9*"
如果命令执行成功并列出 devtoolset-9-gcc 等包,则证明仓库配置正确。
3.4 安装 Devtoolset-9
如果上一步验证成功,则可以执行安装:
sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
3.5 激活与验证新版 GCC
安装完成后,可通过以下方式激活并使用新版本的 GCC 来编译 greenlet:
# 激活 devtoolset-9 环境
scl enable devtoolset-9 bash
# 验证 GCC 版本
gcc -v
# 此时,即可使用新版本的 gcc 编译 greenlet
若希望永久生效,可将 source /opt/rh/devtoolset-9/enable 添加到 ~/.bashrc 文件中。