centos的glibc升级方案 'GLIBCXX_3.4.15' not found错误的解决

升级Centos系统之后,运行filezilla时,出现如下错误的提示信息:

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...)

如果是64位系统报错信息如下:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...)

原因是没有GLIBCXX_3.4.15版本,或是更高的版本。
输入命令查询一下结果:

[root@localhost ~]# strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

我们看到当前GCC版本中的确没有GLIBCXX_3.4.15。

64位系统命令为:

[root@localhost ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

下载新版本,地址:http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_i386.deb

64位系统:
http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6_4.7.2-5_amd64.deb

假设下载的文件放在/data0/software/。
解压:

[root@localhost software]# ar -x libstdc++6_4.7.2-5_i386.deb && tar xvf data.tar.gz
解压后出现/data0/software/usr目录;
[root@localhost software]# cd  /data0/software/usr/lib/i380-linux-gun
[root@localhost i386-linux-gnu]# cp libstdc++.so.6.0.17 /usr/lib
[root@localhost i386-linux-gnu]# /usr/lib
[root@localhost lib]# rm libstdc++.so.6
[root@localhost lib]# ln libstdc++.so.6.0.17 libstdc++.so.6

注意64位系统为
[root@localhost software]# cd  /data0/software/usr/lib/x86_64-linux-gnu
[root@localhost x86_64-linux-gnu]# cp libstdc++.so.6.0.17 /usr/lib64
[root@localhost x86_64-linux-gnu]# /usr/lib
[root@localhost lib64]# rm libstdc++.so.6
[root@localhost lib64]# ln libstdc++.so.6.0.17 libstdc++.so.6

重新建立软连接,我们再输入命令查询一下结果:

[root@localhost lib]# strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_DEBUG_MESSAGE_LENGTH

已经安装好GLIBCXX_3.4.15啦。

重新切换到目录并运行,正常啦!/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ...)已经解决。

### **分析你的 `libstdc++` 版本** 从你的输出结果来看,你的 `libstdc++.so` 最高版本是 **`GLIBCXX_3.4.19`**,这是 **GCC 4.8.5 的标准库版本**,符合 C++11 的基本支持要求。但 **部分高级 C++11 功能可能仍然不稳定**(如 `<regex>`、`std::thread`)。 --- ### **1. 为什么仍然报错?** 即使 `libstdc++` 版本匹配 GCC 4.8.5,报错可能有以下原因: 1. **代码使用了不完整的 C++11 特性**(如 `<regex>` 在 GCC 4.8.5 下实现不完整)。 2. **头文件冲突**(如系统 `/usr/include` 和 GCC 自带头文件混用)。 3. **动态库加载错误**(运行时链接了错误的 `libstdc++.so`)。 4. **编译器 Bug**(GCC 4.8.5 对某些模板推导或并发支持不完善)。 --- ### **2. 排查步骤** #### **(1) 确认报错的具体代码** - 如果报错涉及 `<regex>` 或 `<thread>`,可能是 GCC 4.8.5 的实现问题。 - 如果是模板或 `constexpr` 报错,可能是编译器限制。 #### **(2) 检查运行时加载的 `libstdc++.so`** ```bash # 查看你的程序实际加载的 libstdc++.so 路径 ldd ./your_program | grep libstdc++ ``` 如果输出的路径 **不是 `/usr/lib64/libstdc++.so.6` 或 GCC 自带路径**,可能存在版本冲突。 #### **(3) 检查头文件路径** ```bash # 查看 GCC 的头文件搜索路径 g++ -v -x c++ /dev/null -fsyntax-only 2>&1 | grep -A5 "#include" ``` 确保没有混用不同版本的头文件(如 `/usr/include/c++/4.8.5` 和 `/usr/local/include` 冲突)。 --- ### **3. 解决方案** #### **(1) 替换不稳定的 C++11 特性** - **用 `boost` 替代不完整的标准库组件**: ```cpp #include <boost/regex.hpp> // 替代 <regex> #include <boost/thread.hpp> // 替代 <thread> ``` - **改用 C++98 兼容写法**(如显式指定类型代替 `auto`)。 #### **(2) 强制链接正确的 `libstdc++.so`** ```bash # 编译时指定库路径 g++ -std=c++11 -L$(dirname $(g++ -print-file-name=libstdc++.so)) your_code.cpp # 或运行时指定 export LD_LIBRARY_PATH=$(dirname $(g++ -print-file-name=libstdc++.so)):$LD_LIBRARY_PATH ``` #### **(3) 静态链接 `libstdc++`** ```bash g++ -std=c++11 -static-libstdc++ your_code.cpp -o output ``` (注意:这会增大二进制文件体积,且可能影响动态库兼容性。) #### **(4) 升级编译器** 如果问题无法规避,建议升级到 **GCC 5+**: ```bash # CentOS 7 使用 devtoolset sudo yum install devtoolset-9-gcc-c++ scl enable devtoolset-9 bash ``` --- ### **4. 验证问题是否解决** 以 `<regex>` 为例: ```cpp #include <iostream> #include <regex> int main() { std::regex r("test"); std::cout << "Regex compiled!" << std::endl; return 0; } ``` - **如果报错**:改用 `boost::regex` 或升级 GCC。 - **如果通过**:检查其他代码段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值