在 CentOS 系统的生命周期内,其软件仓库为了确保极致的稳定性和兼容性,通常不会包含最新版本的软件包,GCC(GNU Compiler Collection)作为 Linux 系统下最核心的编译工具链,同样遵循这一原则,许多现代应用程序、开源库(如 Boost、gRPC)或开发框架(如某些版本的 PyTorch)依赖于较新版本的 GCC 才能提供的 C++11/14/17/20 标准支持、优化特性或新的语言功能,在 CentOS 上升级 GCC 成为了许多开发者和系统管理员不可避免的任务,本文将详细介绍如何利用 yum 及其相关机制,安全、高效地在 CentOS 上升级 GCC。

检查当前 GCC 版本
在进行任何升级操作之前,首先需要确认系统中当前安装的 GCC 版本,这可以通过在终端中执行以下命令来完成:
gcc --version
或者使用更详细的 g++ 命令:
g++ -v
输出结果会显示详细的版本信息,gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44),在 CentOS 7 中,默认的 GCC 版本通常是 4.8.x,这个版本非常老旧,缺少对现代 C++ 标准的完整支持,在 CentOS 8 中,默认版本提升到了 8.x,虽然有所改善,但可能仍无法满足最新软件的需求。
标准升级方法:使用 Base 和 Updates 仓库
最直接的升级方式是使用 yum 从系统默认的 Base 和 Updates 仓库中获取更新,执行以下命令:
sudo yum update gcc
或者,如果系统中尚未安装 GCC:
sudo yum install gcc
局限性:这种方法简单且安全,但有一个显著的缺点:它只能升级到当前 CentOS 小版本所维护的仓库中的最新 GCC 版本,对于 CentOS 7,这意味着你几乎无法通过此方法摆脱 4.8.x 版本,对于 CentOS 8,你也只能获得该系列(如 8.5)的更新,而无法跃升至 GCC 9、10、11 等更高版本,对于需要现代编译器特性的用户,此方法通常是不够的。
高级方法:使用 Software Collections (SCLo)
为了在不破坏系统稳定性的前提下提供更新的软件,CentOS 社区推出了 Software Collections(SCL),SCL 允许用户在同一系统中并行安装和使用多个版本的软件,而不会覆盖系统默认的版本,这是在 CentOS 7 和 8 上获取现代 GCC 版本的推荐方法。
步骤 1:安装 SCLo 发布仓库
你需要安装用于启用 SCL 的仓库。
对于 CentOS 7:

sudo yum install centos-release-scl
对于 CentOS 8:
sudo yum install centos-release-scl sudo yum config-manager --set-enabled powertools
(在 CentOS 8 中,PowerTools 仓库包含了 SCL 的许多开发工具包)
步骤 2:查找并安装所需的 GCC 版本
安装好仓库后,你可以搜索可用的 GCC 工具集,在 CentOS 7 中,它们通常被称为 devtoolset,而在 CentOS 8 中则称为 gcc-toolset。
# 对于 CentOS 7 yum list available --showduplicates | grep devtoolset # 对于 CentOS 8 yum list available --showduplicates | grep gcc-toolset
你会看到一个列表,devtoolset-9, devtoolset-10, gcc-toolset-9, gcc-toolset-11 等,选择你需要的版本进行安装,要安装 GCC 11(在 CentOS 8 中):
sudo yum install gcc-toolset-11
或者在 CentOS 7 中安装 GCC 9:
sudo yum install devtoolset-9
安装过程会自动将该版本 GCC 及其相关依赖(如 g++, gdb)安装到 /opt/rh/ 目录下。
步骤 3:启用新的 GCC 环境
安装完成后,新版本的 GCC 并不会自动覆盖系统默认的 gcc 命令,你需要通过 scl 命令来临时启用它,这会为你当前的 Shell 会话设置必要的环境变量(如 PATH, LD_LIBRARY_PATH)。
# 启用 CentOS 8 中的 GCC 11 scl enable gcc-toolset-11 bash # 启用 CentOS 7 中的 GCC 9 scl enable devtoolset-9 bash
执行该命令后,你会开启一个新的 Bash Shell,在这个新的 Shell 中,再次检查 GCC 版本:
gcc --version
输出的版本应该就是你刚刚安装的新版本了,所有编译和构建工作都应该在这个 scl enable 环境中进行。

方法对比与选择
为了更清晰地理解不同方法的差异,下表对它们进行了小编总结:
| 特性 | 标准 yum 升级 | SCLo 方法 |
|---|---|---|
| 易用性 | 非常简单,一条命令即可 | 稍复杂,需要安装仓库和指定版本 |
| 可用版本 | 受限于系统仓库,通常较旧 | 提供多个现代版本(如 GCC 7, 9, 11) |
| 系统影响 | 可能更新系统核心组件,风险较高 | 并行安装,不影响系统默认版本,非常安全 |
| 使用方式 | 直接使用 gcc 命令 | 需通过 scl enable 命令启用新环境 |
| 推荐度 | 低(仅满足基本需求) | 高(开发者和需要新特性的首选) |
在 CentOS 上升级 GCC 是一个常见的需求,虽然标准的 yum update 操作简单,但其提供的版本往往无法满足现代软件开发的要求,相比之下,利用 Software Collections (SCLo) 是一种更优越、更安全的策略,它不仅能让您获得所需的现代 GCC 版本,还能保持系统核心环境的稳定与纯净,避免了因升级编译器而导致的潜在系统问题,对于绝大多数开发者而言,掌握 SCL 的使用方法是高效利用 CentOS 进行开发工作的关键技能。
相关问答FAQs
问题 1:我如何让系统默认使用通过 SCL 安装的新版 GCC,而不是每次都手动输入 scl enable 命令?
回答: 强烈不建议将新版 GCC 设置为整个系统的默认编译器,因为这可能会影响到依赖系统旧版 GCC 的关键工具(如 yum 自身、内核模块编译等),导致系统不稳定,正确的做法是为特定用户或特定项目启用它,你可以将 scl enable 命令添加到你用户的 Shell 配置文件中(如 ~/.bashrc 或 ~/.bash_profile),这样每次你登录时就会自动启用新环境,添加的行如下:
source scl enable gcc-toolset-11 bash
这样,只有你的用户会话会默认使用新版 GCC,而系统其他部分保持不变。
问题 2:我可以从源代码编译并安装 GCC 吗?这和 SCLo 方法相比有什么优缺点?
回答: 当然可以,从源代码编译安装 GCC 能让你获得最新的版本,并且可以进行高度自定义的配置,这种方法有明显的缺点:
- 耗时耗力:编译 GCC 本身是一个非常漫长的过程,可能需要数小时。
- 依赖复杂:编译过程需要一系列前置依赖库(如 GMP, MPFR, MPC),解决这些依赖关系可能很麻烦。
- 管理困难:手动安装的软件不在
yum的管理范围内,后续的更新、卸载都非常不便。 - 潜在冲突:如果安装路径不当(如安装到
/usr/local),仍然可能与系统软件包产生冲突。
相比之下,SCLo 方法由社区维护,安装快速、卸载方便(yum remove)、与系统完美隔离,是绝大多数场景下的最佳选择,只有在 SCLo 中没有你需要的特定 GCC 版本,或者你需要对 GCC 进行特殊的补丁和配置时,才考虑从源代码编译。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复