问题
Linux 上运行可执行文件,报错:
原因
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上去。