CentOS 7 升级安装 GCC 9.5 完全教程

前言

CentOS 7 默认提供的 GCC 版本为 4.8.5,这个版本发布于 2015 年,已经无法满足现代 C/C++ 项目的编译需求。许多开源项目(如 MySQL 8.0、Redis 7、QEMU 等)都要求 GCC 5.1 甚至更高版本。本文将详细介绍如何在 CentOS 7 上安全地升级安装 GCC 9.5 版本。

GCC 9.5 是 GCC 9 系列的最终版本,支持 C++17 标准,同时保持了较好的稳定性和兼容性,是 CentOS 7 环境下升级 GCC 的推荐选择。

方法一:使用 SCL 源安装(推荐,最简单)

CentOS 提供了 Software Collections (SCL) 源,其中包含高版本的 GCC。这是最简单、最安全的安装方式,不会覆盖系统默认的 GCC。

1. 安装 SCL 源

sudo yum install -y centos-release-scl

2. 安装 GCC 9

sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

3. 启用 GCC 9

临时启用(仅当前 shell 会话有效):

scl enable devtoolset-9 bash

或者使用 source 命令:

source /opt/rh/devtoolset-9/enable

4. 永久启用 GCC 9(可选)

如果希望每次登录都使用 GCC 9,可以将启用命令添加到 ~/.bashrc

echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc
source ~/.bashrc

5. 验证安装

gcc --version
# 应显示:gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

方法二:从源码编译安装 GCC 9.5

如果需要精确的 9.5 版本或者 SCL 源不可用,可以从源码编译安装。这种方式更灵活,但编译时间较长(约 30-60 分钟)。

1. 安装编译依赖

sudo yum groupinstall -y "Development Tools"
sudo yum install -y gmp-devel mpfr-devel libmpc-devel zlib-devel bzip2

2. 下载 GCC 9.5 源码

cd /usr/local/src
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz
tar -xf gcc-9.5.0.tar.xz
cd gcc-9.5.0

3. 下载依赖组件

GCC 编译需要 GMP、MPFR、MPC 三个依赖库,源码包中提供了自动下载脚本:

./contrib/download_prerequisites

4. 创建编译目录并配置

注意:GCC 官方推荐在源码目录之外进行编译(out-of-source build)。

mkdir -p ../gcc-9.5-build
cd ../gcc-9.5-build
../gcc-9.5.0/configure --enable-languages=c,c++ --disable-multilib --prefix=/usr/local/gcc-9.5

配置参数说明:

  • --enable-languages=c,c++:只编译 C 和 C++ 编译器,节省编译时间和空间
  • --disable-multilib:不生成 32 位代码,64 位系统通常不需要
  • --prefix=/usr/local/gcc-9.5:安装路径,避免与系统 GCC 冲突

5. 编译和安装

使用多核编译加速(-j$(nproc) 使用所有 CPU 核心):

make -j$(nproc)
sudo make install

编译完成后,验证安装:

/usr/local/gcc-9.5/bin/gcc --version
# 应显示:gcc (GCC) 9.5.0

6. 配置系统使用新 GCC

有两种方式让系统使用新版本的 GCC:

方式 A:创建符号链接(推荐)

sudo mv /usr/bin/gcc /usr/bin/gcc.bak
sudo mv /usr/bin/g++ /usr/bin/g++.bak
sudo ln -s /usr/local/gcc-9.5/bin/gcc /usr/bin/gcc
sudo ln -s /usr/local/gcc-9.5/bin/g++ /usr/bin/g++
sudo ln -s /usr/local/gcc-9.5/bin/c++ /usr/bin/c++

方式 B:使用 alternatives 管理多版本

sudo alternatives --install /usr/bin/gcc gcc /usr/local/gcc-9.5/bin/gcc 90
sudo alternatives --install /usr/bin/gcc gcc /usr/bin/gcc.bak 40
sudo alternatives --install /usr/bin/g++ g++ /usr/local/gcc-9.5/bin/g++ 90
sudo alternatives --install /usr/bin/g++ g++ /usr/bin/g++.bak 40

使用 sudo alternatives --config gcc 可以切换默认版本。

7. 配置动态链接库

编译源码版 GCC 后,还需要配置动态链接库路径,否则运行新编译的程序时可能报错 libstdc++.so.6: version 'GLIBCXX_3.4.26' not found

echo "/usr/local/gcc-9.5/lib64" | sudo tee /etc/ld.so.conf.d/gcc-9.5.conf
sudo ldconfig

验证动态库:

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
# 应该能看到 GLIBCXX_3.4.26 及更高版本

常见问题与解决方案

1. 编译时提示内存不足

如果服务器内存较小(如 2GB),编译 GCC 时可能因内存不足而失败。可以添加 swap 分区:

sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo mkswap /swapfile
sudo swapon /swapfile

编译完成后可以移除:

sudo swapoff /swapfile
sudo rm /swapfile

2. 编译时提示 gmp/mpfr/mpc 版本过低

确保已运行 ./contrib/download_prerequisites 下载正确版本的依赖库。如果仍然报错,可以手动安装:

# 安装 GMP 6.1.0
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gmp/gmp-6.1.2.tar.xz
tar -xf gmp-6.1.2.tar.xz && cd gmp-6.1.2
./configure --prefix=/usr/local/gmp && make -j$(nproc) && sudo make install
cd ..

# 安装 MPFR 4.0.2
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpfr/mpfr-4.0.2.tar.xz
tar -xf mpfr-4.0.2.tar.xz && cd mpfr-4.0.2
./configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp && make -j$(nproc) && sudo make install
cd ..

# 安装 MPC 1.1.0
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/mpc/mpc-1.1.0.tar.gz
tar -xf mpc-1.1.0.tar.gz && cd mpc-1.1.0
./configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr && make -j$(nproc) && sudo make install
cd ..

然后重新配置 GCC:

../gcc-9.5.0/configure --enable-languages=c,c++ --disable-multilib \
  --prefix=/usr/local/gcc-9.5 \
  --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc

3. 编译的程序运行时提示 libstdc++.so 版本问题

确认已执行 sudo ldconfig,并检查 libstdc++.so.6 是否指向新版本:

ls -l /usr/lib64/libstdc++.so.6
# 如果指向旧版本,需要更新链接:
sudo cp /usr/local/gcc-9.5/lib64/libstdc++.so.6.0.27 /usr/lib64/
cd /usr/lib64
sudo rm libstdc++.so.6
sudo ln -s libstdc++.so.6.0.27 libstdc++.so.6

4. SCL 方式安装后 gcc 版本未变化

SCL 安装的 GCC 不会自动替换系统默认版本,需要手动启用:

source /opt/rh/devtoolset-9/enable
gcc --version  # 确认版本已更新

总结

对于大多数用户,推荐使用 SCL 源安装 devtoolset-9,简单安全且不影响系统稳定性。如果需要精确的 GCC 9.5 版本或 SCL 源不可用,则从源码编译安装。

升级 GCC 后,建议重新编译依赖 GCC 的项目以确保兼容性。在生产环境操作前,请务必在测试环境中验证。

参考链接

发表回复

后才能评论