关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

CentOS7如何升级GCC版本以解决GLIBCXX_3.4.21

发布时间:2025/11/25 9:49:31
香港云服务器

在 CentOS 7 系统中,默认安装的 GCC 版本为?4.8.5,对应的 C++ 标准库(libstdc++.so.6)最高仅支持?GLIBCXX_3.4.19。当运行依赖?GLIBCXX_3.4.21?及以上版本的程序时(如高版本 Python 库、C++ 编译的应用),会出现?“GLIBCXX_3.4.21 not found”?错误。

解决该问题的核心是升级 GCC 版本(推荐升级到 8/9 版本,可支持?GLIBCXX_3.4.25?及以上),同时更新系统的?libstdc++.so.6?库。以下是详细的分步操作指南:

一、问题根源确认

在操作前,先通过以下命令确认当前系统的 GCC 版本和?libstdc++?支持的?GLIBCXX?版本,明确问题是否匹配:

1. 查看当前 GCC 版本

gcc --version

# 输出示例(默认版本):

# gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44.el7)

BashCopy

2. 查看?libstdc++?支持的?GLIBCXX?版本

strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

# 输出中若没有 "GLIBCXX_3.4.21",则确认是版本不足问题

BashCopy

二、升级 GCC 的两种常用方法

CentOS 7 默认 YUM 源中没有高版本 GCC,需通过?SCL 软件源(推荐,安全不覆盖系统默认 GCC)?或?源码编译(适合需自定义版本场景)?升级。

方法一:通过 SCL 软件源升级(推荐,简单高效)

SCL(Software Collections)是 Red Hat 官方提供的第三方源,可在不覆盖系统默认 GCC 的前提下,安装并启用高版本 GCC,避免破坏系统依赖(如系统工具依赖默认 GCC 4.8.5)。

步骤 1:安装 SCL 源

CentOS 7 默认已预装 SCL 基础源,若未安装,执行以下命令:

sudo yum install -y centos-release-scl

BashCopy

步骤 2:安装高版本 GCC(以 GCC 9 为例,支持 GLIBCXX_3.4.25)

SCL 源提供的 GCC 版本包括 7、8、9、10 等,这里选择兼容性较好的?GCC 9(如需其他版本,将?devtoolset-9-gcc?替换为?devtoolset-8-gcc?等):

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

BashCopy

步骤 3:启用高版本 GCC

SCL 安装的 GCC 不会自动生效,需通过以下命令临时启用(仅当前终端会话有效):

scl enable devtoolset-9 bash

BashCopy

(可选)设置 GCC 永久生效

若需所有终端会话默认使用 GCC 9,可将启用命令添加到用户环境变量或系统全局变量:

用户级(仅当前用户生效):?

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

source ~/.bashrc  # 立即生效

BashCopy

系统级(所有用户生效):?

sudo echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile

source /etc/profile  # 立即生效

BashCopy

步骤 4:验证 GCC 版本

gcc --version

# 输出示例(成功升级):

# gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

BashCopy

方法二:通过源码编译升级(适合自定义版本)

若 SCL 源中没有所需的 GCC 版本(如 GCC 11+),可通过源码编译安装。该方法步骤较多,且需注意避免覆盖系统默认 GCC。

步骤 1:安装编译依赖

sudo yum install -y wget gcc gcc-c++ make bzip2-devel ncurses-devel libmpc-devel mpfr-devel gmp-devel

BashCopy

步骤 2:下载 GCC 源码(以 GCC 9.5.0 为例)

从 GCC 官方镜像下载源码包(选择稳定版本,如 9.5.0):

# 进入临时目录

cd /tmp

# 下载源码(官方镜像链接,可替换为国内镜像如清华源:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/)

wget https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz

# 解压源码

tar -zxvf gcc-9.5.0.tar.gz

cd gcc-9.5.0

BashCopy

步骤 3:下载 GCC 依赖的第三方库(GMP、MPFR、MPC)

GCC 编译依赖这三个库,源码包中提供了自动下载脚本:

./contrib/download_prerequisites

BashCopy

步骤 4:配置编译参数(重要,避免覆盖系统默认 GCC)

创建独立的编译目录(推荐,避免污染源码目录),并指定安装路径为?/usr/local/gcc-9.5.0(不覆盖系统默认的?/usr/bin/gcc):

# 创建编译目录

mkdir -p build && cd build

# 配置参数(--prefix指定安装路径,--enable-languages支持C/C++)

../configure --prefix=/usr/local/gcc-9.5.0 \

            --enable-languages=c,c++ \

            --disable-multilib \

            --enable-threads=posix

BashCopy

步骤 5:编译并安装

编译过程耗时较长(取决于服务器配置,10-30 分钟),建议使用多线程加速(-j4?表示 4 线程,根据 CPU 核心数调整):

make -j4  # 多线程编译,减少时间

sudo make install  # 安装到指定路径

BashCopy

步骤 6:设置环境变量(让系统识别新 GCC)

通过软链接或环境变量指定新 GCC 的路径,避免直接替换系统默认 GCC:

# 方法1:添加环境变量(用户级永久生效)

echo "export PATH=/usr/local/gcc-9.5.0/bin:\$PATH" >> ~/.bashrc

echo "export LD_LIBRARY_PATH=/usr/local/gcc-9.5.0/lib64:\$LD_LIBRARY_PATH" >> ~/.bashrc

source ~/.bashrc  # 立即生效

# 方法2:创建软链接(系统级,谨慎使用,避免冲突)

# sudo ln -s /usr/local/gcc-9.5.0/bin/gcc /usr/bin/gcc-9

# sudo ln -s /usr/local/gcc-9.5.0/bin/g++ /usr/bin/g++-9

BashCopy

步骤 7:验证源码编译的 GCC

gcc --version

# 输出示例:gcc (GCC) 9.5.0

BashCopy

三、验证?GLIBCXX_3.4.21?是否生效

升级 GCC 后,需确认?libstdc++.so.6?已包含?GLIBCXX_3.4.21:

1. 查看新 GCC 对应的?libstdc++.so.6?路径

若通过 SCL 安装(GCC 9),路径为:/opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6若通过源码编译(安装路径?/usr/local/gcc-9.5.0),路径为:/usr/local/gcc-9.5.0/lib64/libstdc++.so.6

2. 检查该库支持的?GLIBCXX?版本

# 以SCL的GCC 9为例,替换路径为你的实际路径

strings /opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.21

BashCopy

若输出?GLIBCXX_3.4.21,则说明库已支持;若未输出,需重新检查 GCC 安装步骤是否正确。

四、解决?libstdc++.so.6?路径引用问题

部分程序可能仍默认引用系统旧版本的?libstdc++.so.6(/usr/lib64/libstdc++.so.6),需通过以下方法让程序使用新库:

方法 1:临时指定库路径(仅当前终端有效)

运行依赖新库的程序前,执行以下命令:

# 以SCL的GCC 9为例,替换路径为你的实际路径

export LD_LIBRARY_PATH=/opt/rh/devtoolset-9/root/usr/lib64:$LD_LIBRARY_PATH

# 再运行程序,如:./your_program

BashCopy

方法 2:永久更新系统?libstdc++.so.6?软链接(推荐)

将系统默认的?libstdc++.so.6?软链接指向新 GCC 的?libstdc++.so.6(需先备份旧库,避免系统崩溃):

# 1. 备份旧的软链接

sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old

# 2. 创建新的软链接(以SCL的GCC 9为例,替换路径为你的实际路径)

sudo ln -s /opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6

# 3. 验证软链接是否正确

ls -l /usr/lib64/libstdc++.so.6

# 输出示例:lrwxrwxrwx. 1 root root 54 Aug 26 10:00 /usr/lib64/libstdc++.so.6 -> /opt/rh/devtoolset-9/root/usr/lib64/libstdc++.so.6

BashCopy

方法 3:为单个程序指定库路径(永久)

若仅需特定程序使用新库,可修改程序的启动脚本,在启动命令前添加?LD_LIBRARY_PATH:

# 编辑启动脚本(如your_program.sh)

vi your_program.sh

# 添加以下内容(替换路径为你的实际路径)

LD_LIBRARY_PATH=/opt/rh/devtoolset-9/root/usr/lib64:$LD_LIBRARY_PATH ./your_program

BashCopy

五、常见问题与注意事项

SCL 启用后新终端不生效?

需确认是否已将?source /opt/rh/devtoolset-9/enable?添加到?~/.bashrc?或?/etc/profile,并执行?source ~/.bashrc?生效。

源码编译时提示 “内存不足”?

CentOS 7 最小实例(如 1GB 内存)可能因内存不足导致编译失败,可通过添加交换分区(Swap)解决:

bash

# 创建2GB交换分区

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

BashCopy

更新软链接后系统工具(如 yum)报错?

若误将系统默认 GCC 覆盖,可能导致 yum 等工具依赖的旧库失效。此时需恢复旧软链接:

bash

sudo rm /usr/lib64/libstdc++.so.6

sudo ln -s /usr/lib64/libstdc++.so.6.old /usr/lib64/libstdc++.so.6

BashCopy

建议优先使用 SCL 方法,避免直接覆盖系统默认 GCC

验证?GLIBCXX?时仍未找到目标版本?

检查 GCC 安装是否完整(需同时安装?gcc-c++,否则?libstdc++?未更新),并确认软链接指向的是新库路径。

总结

解决?GLIBCXX_3.4.21 not found?问题的核心流程:

确认当前 GCC 和?libstdc++?版本 → 2. 通过 SCL 或源码升级 GCC 到 9+ → 3. 验证新库支持?GLIBCXX_3.4.21?→ 4. 配置程序引用新库路径。

推荐优先使用 SCL 方法,操作简单且不破坏系统默认依赖,适合大多数 CentOS 7 用户。