上一篇 下一篇 分享链接 返回 返回顶部

详解CentOS7如何升级GCC版本以解决GLIBCXX_3.4.21未找到的问题

发布人:破碎工坊云计算 发布时间:2 天前 阅读量:6
在 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)
 

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

 
 
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
# 输出中若没有 "GLIBCXX_3.4.21",则确认是版本不足问题
 

二、升级 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
 

步骤 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
 

步骤 3:启用高版本 GCC

SCL 安装的 GCC 不会自动生效,需通过以下命令临时启用(仅当前终端会话有效):
 
scl enable devtoolset-9 bash
 
(可选)设置 GCC 永久生效
若需所有终端会话默认使用 GCC 9,可将启用命令添加到用户环境变量或系统全局变量:

 

  • 用户级(仅当前用户生效)
     
     
    echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc
    source ~/.bashrc  # 立即生效
    
     
  • 系统级(所有用户生效)
     
     
    sudo echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    source /etc/profile  # 立即生效
    
     

步骤 4:验证 GCC 版本

gcc --version
# 输出示例(成功升级):
# gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
 

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

若 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
 

步骤 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

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

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

步骤 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

步骤 5:编译并安装

编译过程耗时较长(取决于服务器配置,10-30 分钟),建议使用多线程加速(-j4 表示 4 线程,根据 CPU 核心数调整):
make -j4  # 多线程编译,减少时间
sudo make install  # 安装到指定路径

步骤 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

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

gcc --version
# 输出示例:gcc (GCC) 9.5.0

三、验证 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
 
  • 若输出 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
 

方法 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
 

方法 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
 

五、常见问题与注意事项

  1. SCL 启用后新终端不生效?
    需确认是否已将 source /opt/rh/devtoolset-9/enable 添加到 ~/.bashrc 或 /etc/profile,并执行 source ~/.bashrc 生效。
  2. 源码编译时提示 “内存不足”?
    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
    
     
  3. 更新软链接后系统工具(如 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
    
     

    建议优先使用 SCL 方法,避免直接覆盖系统默认 GCC
  4. 验证 GLIBCXX 时仍未找到目标版本?
    检查 GCC 安装是否完整(需同时安装 gcc-c++,否则 libstdc++ 未更新),并确认软链接指向的是新库路径。

总结

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

 

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

 

推荐优先使用 SCL 方法,操作简单且不破坏系统默认依赖,适合大多数 CentOS 7 用户。
目录结构
全文
微信客服 微信客服
服务热线: 400-9989-596
电子邮箱: ltd@crash.work