升级GCC后运行程序出现错误:

/usr/lib64/libstdc++.so.6: version "CXXABI_1.3.9" not found

问题的原因是因为升级GCC后相应的动态库没有更新,程序找不到新版本GCC库中的符号,运行不成功。

使用ls 命令查看该文件可以看到动态库是一个软链接:

> ls -l /usr/lib64/libstdc++.so.6
lrwxrwxrwx 1 root root 19 Aug 24 12:28 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.13

通过strings命令读取对应符号的版本,发现目前只有1.3.4,并没有需要的1.3.9:

> strings /usr/lib/libstdc++.so.6.0.13 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4

因此需要手动更新动态库,动态库位于gcc编译目录下,可以在遍历目录下查找:

> cd **/gcc-7.2.0/build/ # build是编译时创建的目录
> find . -name "libstdc++.so.*"
./prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
./prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
./stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.24
./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6

有三个不同版本的库目录,prev 开头的应该是预览版本,stage1 不知道是什么版本,用第三个就好了。

> /bin/cp -f x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6* /usr/lib
> rm -f /usr/lib64/libstdc++.so.6 # 移出旧链接
> ln -s /usr/lib/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6 # 创建新链接

查看动态库版本:

> strings /usr/lib/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

然后运行程序就不会报错了。

最后修改:2020 年 02 月 16 日
如果觉得我的文章对你有用,请随意赞赏