升级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
然后运行程序就不会报错了。
此处评论已关闭