解决 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ not found (required by 问题

本文介绍了如何解决因动态库缺失或版本不匹配导致的应用程序启动失败问题。通过修改ld.so.conf并添加动态库路径,使用ldconfig刷新配置,以及查找并替换所需的动态库版本,最终使应用程序正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.缺少动态库问题,复制到同一目录也没找到

编辑 vim /etc/ld.so.conf 将动态库目录添加进去,执行ldconfig即可

include ld.so.conf.d/*.conf
/root/poco/myPocoTest

刷新

sudo ldconfig

或者临时刷新

~$ LD_LIBRARY_PATH=/usr/local/lib
~$ export LD_LIBRARY_PATH
~$ g++ poco.cpp -lPocoNet
~$ ./a.out

2.libstdc++.so.6版本问题

[root@jn myPocoTest]# ./a.out 
./a.out: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /root/poco/myPocoTest/libPocoFoundation.so.71)
./a.out: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /root/poco/myPocoTest/libPocoNet.so.71)
./a.out: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /root/poco/myPocoTest/libPocoNet.so.71)

查看缺少GLIBCXX_3.4.20

[root@jn myPocoTest]# strings /usr/lib64/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_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

原因是升级gcc时动态库没有替换旧的动态库文件

查找编译过的gcc库文件位置:

find / -name "libstdc++.so*"
[root@jn myPocoTest]# find / -name "libstdc++.so*"
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/local/gcc/lib64/libstdc++.so.6.0.20-gdb.py
/usr/local/gcc/lib64/libstdc++.so.6
/usr/local/gcc/lib64/libstdc++.so.6.0.20
/usr/local/gcc/lib64/libstdc++.so
/usr/local/gpsserv/libstdc++.so.6
/usr/local/gpsserv_2/libstdc++.so.6
/root/.debug/usr/lib64/libstdc++.so.6.0.19
/root/lib/libstdc++.so.6
/root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/GCC_4.9.2/gcc-4.9.2/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/GCC_4.9.2/gcc-4.9.2/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/root/GCC_4.9.2/gcc-4.9.2/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/GCC_4.9.2/gcc-4.9.2/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/GCC_4.9.2/gcc-4.9.2/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20
/root/GCC_4.9.2/gcc-4.9.2/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/root/downloads/datahub_C++_sdk_14.0/lib/libstdc++.so.6
/root/downloads/datahub_cpp_sdk_release_64/allfiles/libstdc++.so.6
/root/downloads/datahub_cpp_sdk_release_64/lib/libstdc++.so.6
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/stage1-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/stage1-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/stage1-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/prev-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/prev-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
/var/lib/docker/overlay2/e05124a5a8cdb68cbf1b5394067bf87ba508301ed91d84c1d7cff3316c3a1e21/diff/tmp/tmp.QX7dilbd7Z/prev-x86_64-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/var/lib/docker/overlay2/70bba9113499bdc3ce4d083aee2c0c69e385cd1bb8596cd5b5658868e5aca6a7/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/70bba9113499bdc3ce4d083aee2c0c69e385cd1bb8596cd5b5658868e5aca6a7/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
/var/lib/docker/overlay2/70bba9113499bdc3ce4d083aee2c0c69e385cd1bb8596cd5b5658868e5aca6a7/diff/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25-gdb.py
/var/lib/docker/overlay2/53b08252aeea199eb2780e77b8c6cd8924eaf10120ab43993bdbe2380e3fc28f/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6

发现存在相同,检查字符发现确实多了很多高版本的

[root@jn myPocoTest]# strings /root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/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_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_DEBUG_MESSAGE_LENGTH
_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4
_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv@@GLIBCXX_3.4.5
_ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@GLIBCXX_3.4
_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4.5
GLIBCXX_3.4.9
_ZSt10adopt_lock@@GLIBCXX_3.4.11
GLIBCXX_3.4.10
GLIBCXX_3.4.16
GLIBCXX_3.4.1
_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@GLIBCXX_3.4
_ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4
_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@@GLIBCXX_3.4.5
_ZNSs7_M_moveEPcPKcm@@GLIBCXX_3.4.5
_ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4
_ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4
_ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@@GLIBCXX_3.4.5
_ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4
_ZSt10defer_lock@@GLIBCXX_3.4.11
_ZN10__gnu_norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4
_ZNSs9_M_assignEPcmc@@GLIBCXX_3.4.5

将该文件的软连接文件和源文件一起复制到错误提示的 /lib64 目录下即可

[root@jn myPocoTest]# ll /root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
lrwxrwxrwx 1 root root 19 Mar  1 14:34 /root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 -> libstdc++.so.6.0.20
[root@jn myPocoTest]# cp /root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /lib64/
cp: overwrite ‘/lib64/libstdc++.so.6’? y
[root@jn myPocoTest]# ls
a.out             libPocoCrypto.so.71     libPocoData.so        libPocoDataSQLite.so.71  libPocoFoundation.so     libPocoJSON.so.71  libPocoMongoDB.so     libPocoNet.so.71     libPocoRedis.so     libPocoUtil.so.71  libPocoZip.so     version.cpp
download.cpp      libPocoDataMySQL.so     libPocoData.so.71     libPocoEncodings.so      libPocoFoundation.so.71  libPocoJWT.so      libPocoMongoDB.so.71  libPocoNetSSL.so     libPocoRedis.so.71  libPocoXML.so      libPocoZip.so.71
libPocoCrypto.so  libPocoDataMySQL.so.71  libPocoDataSQLite.so  libPocoEncodings.so.71   libPocoJSON.so           libPocoJWT.so.71   libPocoNet.so         libPocoNetSSL.so.71  libPocoUtil.so      libPocoXML.so.71   Makefile
[root@jn myPocoTest]# cp /root/GCC_4.9.2/gcc-4.9.2/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 /lib64/
[root@jn myPocoTest]# ./a.out 
usage: a <uri>
       Download <uri> to standard output.
       Works with http, ftp and file URIs.

运行成功:

[root@jn myPocoTest]# ./a.out http://121.196.173.100:9682/hello.html
hello,from http server
[root@jn myPocoTest]#
<think>我们正在解决用户遇到的一个具体问题:在解压RAR文件时出现错误提示`libstdc++.so.6:version&#39;GLIBCXX_3.4.20&#39;notfound`。根据引用资料,这通常是因为系统中安装的libstdc++库版本过低,缺少所需的GLIBCXX_3.4.20版本。用户的需求是修复这个错误,以便能够正常解压RAR文件。参考引用资料,我们可以总结出以下解决步骤:1.确认错误:错误信息表明系统缺少GLIBCXX_3.4.20版本的符号,这通常是因为libstdc++.so.6的版本过低。2.检查当前libstdc++版本:使用命令`strings/usr/lib64/libstdc++.so.6|grepGLIBCXX`(或类似路径,根据系统不同可能路径有所差异)查看当前支持的GLIBCXX版本,确认是否确实缺少GLIBCXX_3.4.203.如果当前版本不支持,需要更新libstdc++库。根据引用[3]和[4],更新方法有两种主要途径:a.从官方源升级(如果可用):例如在CentOS中,可以尝试更新gcc或libstdc++包。但要注意,官方源可能不提供足够新的版本(如CentOS7默认的gcc版本是4.8.5,最高只支持到GLIBCXX_3.4.19)。b.手动下载较新版本的libstdc++.so并替换或添加(需要谨慎操作,避免系统不稳定)。4.在引用[4]中提到conda环境下可以通过conda来更新,但用户的问题可能不是在conda环境下,所以我们需要考虑系统级别的更新。根据引用[2],用户的环境是CentOS7.6,并且遇到了同样的两个错误(GLIBCXX_3.4.20和CXXABI_1.3.8)。因此,我们可以参考针对CentOS7的解决方案。具体步骤:步骤1:检查当前libstdc++支持的版本```strings/usr/lib64/libstdc++.so.6|grepGLIBCXX```如果输出中没有`GLIBCXX_3.4.20`,则说明需要更新。步骤2:尝试通过yum更新(可能无法解决,因为CentOS7官方源中的libstdc++版本较低)```sudoyumupdatelibstdc++```然后再次检查版本。如果更新后仍然没有,则需要手动安装更高版本的libstdc++。步骤3:手动安装高版本的libstdc++-从其他来源(如较新的发行版或开发者工具包)获取高版本的libstdc++.so文件。例如,可以从官方GCC发布中下载或者从已经安装了高版本gcc的系统中复制。-引用[3]中提到可以查找已有的库文件(如`find/-namelibstdc++.so.6.0.21`),但如果没有则需要下载。-一种常见的方法是安装较新的GCC版本(例如GCC7或更高),因为新版本的GCC会自带新的libstdc++。在CentOS7上可以通过devtoolset来安装。步骤4:使用devtoolset安装高版本GCC(推荐)-安装CentOSSoftwareCollections(SCL)仓库,然后安装devtoolset-7(或更高版本,如devtoolset-8,devtoolset-9等)。-具体步骤:```sudoyuminstallcentos-release-sclsudoyuminstalldevtoolset-7sclenabledevtoolset-7bash#在当前shell中启用devtoolset-7```-然后检查新版本的libstdc++:`strings/opt/rh/devtoolset-7/root/usr/lib64/libstdc++.so.6|grepGLIBCXX`,应该会看到包含GLIBCXX_3.4.20及更高版本。-但是,这样安装的库在默认情况下只对启用devtoolset的环境有效。为了让系统全局使用,可以将新的库文件复制或链接到系统目录(如/usr/lib64),但这有一定风险,可能影响系统稳定性。另一种方法是在运行需要高版本库的程序时,指定LD_LIBRARY_PATH。步骤5:替换或添加库文件(谨慎操作)-将新版本的库文件(例如从devtoolset-7中得到的`/opt/rh/devtoolset-7/root/usr/lib64/libstdc++.so.6.0.24`)复制到系统库目录(如`/usr/lib64`)。-然后重建符号链接:```cd/usr/lib64sudomvlibstdc++.so.6libstdc++.so.6.bak#备份旧的sudoln-slibstdc++.so.6.0.24libstdc++.so.6```-注意:直接替换系统库可能存在风险,因为系统其他程序可能依赖于旧版本。因此,更推荐使用LD_LIBRARY_PATH的方式。步骤6:使用LD_LIBRARY_PATH(推荐,避免影响系统全局)-在运行解压RAR程序的命令前,设置LD_LIBRARY_PATH指向新库所在的目录。-例如,如果新库在`/opt/rh/devtoolset-7/root/usr/lib64`,则:```exportLD_LIBRARY_PATH=/opt/rh/devtoolset-7/root/usr/lib64:$LD_LIBRARY_PATHrarxfile.rar#然后运行rar命令```-可以将这个export命令写入一个脚本,专门用来运行rar程序。另外,用户的问题是关于解压RAR文件,那么可能使用的是`unrar`或者`rar`命令。如果是因为unrar/rar程序需要高版本的libstdc++,也可以考虑下载静态编译版本的unrar,这样就不依赖系统的动态库。步骤7:使用静态编译的unrar-从RAR实验室下载Linux版本的RAR程序(https://www.rarlab.com/download.htm),选择静态编译版本(通常文件名中包含`static`)。-解压后直接运行其中的`unrar`或`rar`可执行文件,因为是静态链接,所以不依赖系统的libstdc++。总结:推荐的方法依次是:1.尝试使用静态编译版本的unrar(最简单安全)。2.使用devtoolset安装高版本GCC,然后通过设置LD_LIBRARY_PATH来运行rar命令。3.如果上述方法都不可行,再考虑手动替换系统库(需谨慎)。根据引用[3]和[4],我们也可以看到在conda环境下有类似的解决方案,但用户的问题可能不是在conda环境中,所以这里不展开。现在,我们将按照用户要求,提供结构清晰的回答,并生成相关问题。注意:回答中需要引用时,在引用的段落末尾自然地添加引用标识,如[^1]。</think>### 解决 RAR 解压报错:`libstdc++.so.6: version &#39;GLIBCXX_3.4.20&#39; not found` 此错误是由于系统动态库 `libstdc++.so.6` 版本过低,缺少 `GLIBCXX_3.4.20` 符号导致的。以下是逐步解决方案: #### 步骤 1:验证缺失的版本 ```bash # 检查当前支持的 GLIBCXX 版本 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 若输出中**无 `GLIBCXX_3.4.20`**(如 CentOS 7 默认最高到 3.4.19),则需升级库[^2][^3]。 #### 步骤 2:安装高版本 libstdc++ ##### 方法 1:通过开发者工具集(推荐) ```bash # 启用 Software Collections 仓库 sudo yum install centos-release-scl # 安装 devtoolset-8(包含 GCC 8.3+) sudo yum install devtoolset-8 # 激活环境(临时生效) scl enable devtoolset-8 bash # 验证新版本 strings /opt/rh/devtoolset-8/root/usr/lib64/libstdc++.so.6 | grep GLIBCXX ``` 输出应包含 `GLIBCXX_3.4.20`[^3]。 ##### 方法 2:手动更新库文件 ```bash # 下载高版本库(示例:GCC 8.3) wget http://mirror.centos.org/centos/7/sclo/x86_64/rh/devtoolset-8-libstdc++-devel-8.3.1-3.el7.x86_64.rpm # 解压并复制库文件 sudo rpm2cpio devtoolset-8*.rpm | cpio -idv sudo cp -f usr/lib64/libstdc++.so.6.0.25 /usr/lib64/ # 重建软链接 sudo ln -sf /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6 ``` #### 步骤 3:验证修复 ```bash # 检查是否包含 GLIBCXX_3.4.20 strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.20 ``` 出现 `GLIBCXX_3.4.20` 即表示成功[^3]。 #### 备选方案:使用静态编译版 RAR 若库更新有风险,可下载静态编译版: ```bash wget https://www.rarlab.com/rar/rarlinux-x64-6.22.tar.gz tar -xzf rarlinux-*.tar.gz cd rar/ ./unrar x yourfile.rar # 不依赖系统库 ``` #### 注意事项 1. **权限问题**:操作需 `sudo` 权限 2. **环境隔离**:若在 Conda 环境中,需更新 Conda 的库(`conda update libgcc`)[^4] 3. **兼容性**:手动替换库可能影响其他程序,建议优先使用开发者工具集 > **根本原因**:系统自带的 GCC 版本过低(CentOS 7 默认为 GCC 4.8.5),而 RAR 需要 ≥GCC 5.2 的库支持[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值