加油
努力

CentOS 7.9下如何升级GCC以支持C++14或更高标准?

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。

云服务器