【C++调试】"./xxx: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./xxx)

问题

Linux 上运行可执行文件,报错:

【C++调试】"./xxx: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./xxx)

 原因

gcc 动态库版本太低

解决方案

1.方案一

不需要 root 权限

 vi  ~/.bash_profile 

在文件中添加如下代码:

LD_LIBRARY_PATH=/home/feng/anaconda3/lib:$LD_LIBRARY_PATH     //(将anaconda3库文件路径添加到系统的库文件路径中)
export LD_LIBRARY_PATH

执行代码:

$ source  ~/.bash_profile

 

2.方案二

需要 root 权限

a. 查看动态库

[root@model Test_Bench]# strings /usr/lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1

发现最高版本只有 1.3.7,没有 1.3.9,说明出现这些问题,是因为升级 gcc 时,生成的动态库没有替换老版本 gcc 的动态库。

[root@model Test_Bench]# ls -l /usr/lib64/libstdc++.so.6
lrwxrwxrwx. 1 root root 19 Jan 15 2021 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19

我们发现 libstdc++.so.6 是个软连接,连接到 libstdc++.so.6.0.19 上的,而 libstdc++.so.6.0.19 是老版本的动态库。所以下面我们要做的就是将 libstdc++.so.6 连接到新版本的动态库上去。

b.  执行以下命令,查找编译 gcc 时生成的最新动态库:(有时找不到最新的动态库,可以参考方案三)

[root@model Test_Bench]# 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.py
/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.pyo
/usr/gcc8.2.0/lib64/libstdc++.so.6.0.25
/usr/gcc8.2.0/lib64/libstdc++.so.6
/usr/gcc8.2.0/lib64/libstdc++.so.6.0.25-gdb.py
/home/software/gcc-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/home/software/gcc-8.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/software/gcc-8.2.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/home/software/gcc-8.2.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/software/gcc-8.2.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.25
/home/software/gcc-8.2.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6

其中/home/software/gcc-8.2.0 是我们升级 gcc 时的输出目录,libstdc++.so.6.0.25 是我们的新版本的动态库。

c. 将上面的最新目录复制到 /usr/lib64/ 目录下:

[root@model Test_Bench]# cp /usr/gcc8.2.0/lib64/libstdc++.so.6.0.25 /usr/lib64/
[root@model Test_Bench]# cd /usr/lib64/

d. 将 libstdc++.so.6 连接到 libstdc++.so.6.0.25 上去:

[root@model Test_Bench]# cd /usr/lib64/
[root@model Test_Bench]# rm -rf libstdc++.so.6
[root@model Test_Bench]# ln -s libstdc++.so.6.0.25 libstdc++.so.6

e.  默认动态库升级完成。重新运行以下命令检查动态库:

[root@model lib64]# strings /usr/lib64/libstdc++.so.6 | grep "CXXABI"
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_1.3.11
CXXABI_TM_1
CXXABI_FLOAT128

可见确实连接到新的动态库上去了。完成!

3. 方案三

进行到方案二步骤 b 时,如果找不到 gcc 中的最新的动态库,可以将 anaconda3/lib 中的 最新的动态库 libstdc++.so.6.0.25 (可能有的版本不一样,只要是版本最新的即可),拷贝到 "/usr/lib64" 目录下。

可以通过下面的命令,查看 anaconda3/lib/libstdc++.so.6 中是否有 CXXABI_1.3.9

[root@model Test_Bench]# strings /anaconda3/lib/libstdc++.so.6 | grep 'CXXABI'

再将 libstdc++.so.6 连接到 libstdc++.so.6.0.25上去。

 

上一篇:centos7升级gcc和glibc


下一篇:乌班图20.04安装noetic版ROS