升级gcc后出现错误:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' n
来源:www.45fan.com 2019-03-29 13:01:19
升级gcc后,今天用g++编译一个c++程序时出现一个错误,如下:
./destructor: /usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./destructor)
经过
网上查找后,发现问题是由于升级了gcc,却没有将升级后的gcc的动态库去替换老版本的gcc动态库所致。
a. 查看动态库
strings /usr/lib/libstdc++.so.6 | grep CXXABI
结果如下:
-
CXXABI_1.3
-
CXXABI_1.3.1
-
CXXABI_1.3.2
-
CXXABI_1.3.3
发现最高版本只有1.3.3,没有1.3.9的。说明出现这些问题,是因为升级gcc
时,生成的动态库没有替换老版本gcc
的动态库。
ls -l /usr/lib/libstdc++.so.6
-
lrwxrwxrwx. 1 root root 19 Apr 7 17:57 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.13
我们发现libstdc++.so.6是个软连接,是连接到libstdc++.so.6.0.13上的,而libstdc++.so.6.0.13是老版本的动态库。所以下面我们要做的就是将libstdc++.so.6连接到新版本的动态库上去。
b. 执行以下命令,查找编译gcc
时生成的最新动态库:
-
find / -name "libstdc++.so.*"
结果如下:
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
-
/usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
-
/usr/local/lib/libstdc++.so.6.0.22
-
/usr/local/lib/libstdc++.so.6.0.22-gdb.py
-
/usr/local/lib/libstdc++.so.6
-
/usr/lib/libstdc++.so.6.0.13
-
/usr/lib/libstdc++.so.6
其中/usr/local/src/gcc-build-6.3.0是我们升级gcc时的输出目录,libstdc++.so.6.0.22就是我们的新版本的动态库。
c. 将上面的最新目录复制到/usr/lib/目录下:
-
cp /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib/
d. 将libstdc++.so.6连接到libstdc++.so.6.0.22上去:
-
cd /usr/lib
-
rm -rf libstdc++.so.6
-
ln -s libstdc++.so.6.0.22 libstdc++.so.6
e. 默认动态库升级完成。重新运行以下命令检查动态库:
-
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_TM_1
-
CXXABI_FLOAT128
可看到确实是连接到新的动态库上去了。完成!