CentOS 7.9 下升级 GCC 以支持 C++14/更高标准
背景说明
CentOS 7.9 默认 GCC 版本为 4.8.5,仅支持 C++11。要支持 C++14(GCC ≥ 4.9)或更高标准,需要安装更新版本的 GCC。
方法一:使用 devtoolset(推荐,最安全)
Red Hat/CentOS 官方提供的软件集合工具,不会覆盖系统默认 GCC。
1. 启用 SCL(Software Collections)仓库
sudo yum install centos-release-scl -y
2. 选择并安装对应 GCC 版本
| 目标标准 | devtoolset 版本 | GCC 版本 | 命令 |
|---|---|---|---|
| C++14 | devtoolset-7 | 7.x | yum install devtoolset-7-gcc* |
| C++17 | devtoolset-9 | 9.x | yum install devtoolset-9-gcc* |
| C++20 | devtoolset-11 | 11.x | yum install devtoolset-11-gcc* |
# 例如安装 devtoolset-9(GCC 9,完整支持 C++17)
sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils -y
3. 激活环境
# 临时激活当前 shell
scl enable devtoolset-9 bash
# 验证版本
gcc --version
g++ --version
4. 永久生效(可选)
echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc
source ~/.bashrc
5. 在 Makefile/CMake 中使用
# Makefile 示例
CXX = scl enable devtoolset-9 'g++'
CXXFLAGS = -std=c++17
或更优雅的方式:
CC = gcc
CXX = g++
CXXFLAGS = -std=c++17
# 使用前先执行: scl enable devtoolset-9 make
CMake 项目:设置环境变量后正常编译即可:
scl enable devtoolset-9 cmake .. scl enable devtoolset-9 make
方法二:从源码编译安装 GCC(灵活但复杂)
1. 安装依赖
sudo yum groupinstall "Development Tools" -y
sudo yum install gmp-devel mpfr-devel libmpc-devel isl-devel zlib-devel -y
2. 下载 GCC 源码
cd /usr/local/src
wget https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz
tar -xzf gcc-9.3.0.tar.gz
cd gcc-9.3.0
3. 下载依赖库脚本
./contrib/download_prerequisites
4. 配置、编译、安装
mkdir build && cd build
../configure --prefix=/usr/local/gcc-9.3.0
--enable-languages=c,c++
--disable-multilib
--with-system-zlib
make -j$(nproc)
sudo make install
5. 配置动态链接库
echo "/usr/local/gcc-9.3.0/lib64" | sudo tee /etc/ld.so.conf.d/gcc-9.3.0.conf
sudo ldconfig
6. 创建符号链接或修改 PATH
export PATH=/usr/local/gcc-9.3.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-9.3.0/lib64:$LD_LIBRARY_PATH
7. 验证
/usr/local/gcc-9.3.0/bin/g++ --version
方法三:使用 EPEL + IUS/Copr 第三方仓库(不推荐用于生产)
sudo yum install epel-release -y
# IUS 或 Copr 可能提供较新 GCC,但稳定性需谨慎评估
⚠️ 第三方包可能与系统其他组件冲突,生产环境慎用。
验证 C++ 标准支持
创建一个测试文件 test.cpp:
#include <iostream>
#include <optional> // C++17
#include <variant> // C++17
#include <any> // C++17
#include <filesystem> // C++17
int main() {
std::optional<int> opt = 42;
if (opt.has_value()) {
std::cout << *opt << std::endl;
}
return 0;
}
编译测试:
# devtoolset-9 方式
scl enable devtoolset-9 'g++ -std=c++17 test.cpp -o test && ./test'
# 源码安装方式
/usr/local/gcc-9.3.0/bin/g++ -std=c++17 test.cpp -o test && ./test
各 GCC 版本支持的 C++ 标准对照表
| GCC 版本 | 最低 C++ 标准 | 完全支持的标准 |
|---|---|---|
| 4.8.x | C++11 | C++11 |
| 4.9.x | C++11 | C++14 |
| 5.x | C++11 | C++14 |
| 6.x | C++11 | C++14 |
| 7.x | C++11 | C++17(部分) |
| 8.x | C++11 | C++17 |
| 9.x | C++11 | C++17 |
| 10.x | C++11 | C++20(部分) |
| 11.x | C++11 | C++20(部分) |
| 12.x | C++11 | C++20 |
| 13.x | C++11 | C++23(部分) |
常见问题排查
Q1: scl enable 命令找不到?
sudo yum install centos-release-scl-rh -y
sudo yum install scl-utils -y
Q2: 编译时报 GLIBCXX_3.4.xx not found
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
# 确保新版 libstdc++ 被正确加载
ldconfig
Q3: CMake 仍使用旧版 GCC
# 显式指定编译器
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
# 或在 CMakeLists.txt 中强制指定
set(CMAKE_C_COMPILER "/opt/rh/devtoolset-9/root/usr/bin/gcc")
set(CMAKE_CXX_COMPILER "/opt/rh/devtoolset-9/root/usr/bin/g++")
Q4: 如何卸载 devtoolset?
sudo yum remove devtoolset-9-gcc*
# 移除 .bashrc 中的 source 行
推荐方案总结
| 场景 | 推荐方法 |
|---|---|
| 生产服务器 | devtoolset(方法一),不影响系统稳定性 |
| 开发/测试环境 | devtoolset 或源码编译均可 |
| 需要最新特性(C++20/23) | devtoolset-11+ 或源码编译 GCC 12/13 |
| Docker 容器 | 基于 centos:7 镜像 + devtoolset |
核心建议:优先使用 devtoolset,它由 Red Hat 维护,与 CentOS 7 兼容性好,且不会破坏系统默认的 GCC。
云小栈