在 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 用户。
Copyright © 2013-2024 8a.hk All Rights Reserved. 八艾云 版权所有 中山市八艾云计算有限公司 粤ICP备14095776号 粤公网安备 44200002445359号
增值电信业务经营许可证编号:B1-20222012
代理域名注册服务机构:西部数码