目录
- 1、查找缺少库版本
- 2、动态库版本与gcc版本对应关系
- 3、查找 libstdc++.so.6.0.x 库文件
- 4、如果libstdc++.so.6.0.21库文件已存在,则按照下面的步骤创建软链接即可
- 4.1 拷贝、软连接
- 4.2验证新的 libstdc++.so.6.0.21 库文件是否生效
- 5、如果libstdc++.so.6.0.21库文件不存在,则需要按照下面的步骤编译新版本的GCC,然后再创建软链接
- 5.1 下载GCC
- 5.2 建立软连接
- 5.3 验证
遇到这个问题的时候是在连接库的时候出现的问题,而且不是在编译的时候出现的,实在运行的时候才 报错,出现这种问题就是因为编译库的编译器和编译当前程序的编译器版本是不一样的,在具体一点就是因为,当前程序的编译器的版本是比较低或较高,只要调整一下就可以了。
1、查找缺少库版本
可以用如下命令查看一下当前GCC版本:
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
在我的机器上运行结果这样的:
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
如果有动态库中要求的GCC版本 ,例如“GLIBCXX_3.4.14”,就要从已经有该库的位置拷贝到/usr/lib/
和/usr/lib64
.
2、动态库版本与gcc版本对应关系
GCC 各版本中 gcc-5.2.0 对应 GLIBCXX_3.4.21 与 libstdc++.so.6.0.21,而 gcc-6.5.0 对应 GLIBCXX_3.4.22 与 libstdc++.so.6.0.22,具体下载的 GCC 版本根据自己的需要进行选择。
对应关系地址:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
对应版本的截图
3、查找 libstdc++.so.6.0.x 库文件
# 这里以一个为例
# 查找库文件
$ find / -name libstdc++.so.6.0.21
$ /lib/libstdc++.so.6.0.21
4、如果libstdc++.so.6.0.21库文件已存在,则按照下面的步骤创建软链接即可
4.1 拷贝、软连接
$ cp /lib/libstdc++.so.6.0.21 /usr/lib
$ cp /lib/libstdc++.so.6.0.21 /usr/lib64
# 删除旧的链接文件
$ rm -f libstdc++.so.6#分别进入/usr/lib和/usr/lib64目录 创建新的链接文件
$ ln -s libstdc++.so.6.0.21 libstdc++.so.6# 查看最终的libstdc++.so库文件列表
$ ls -al /usr/lib64/libstdc++.so.6*
lrwxrwxrwx. 1 root root 19 3月 12 10:08 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x. 1 root root 991616 10月 30 14:39 /usr/lib64/libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 11485880 3月 12 10:01 /usr/lib64/libstdc++.so.6.0.21
4.2验证新的 libstdc++.so.6.0.21 库文件是否生效
如果下面的输出结果中,出现 GLIBCXX_3.4.21,则代表新的 libstdc++.so.6.0.21 库文件生效。
$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.17
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH
5、如果libstdc++.so.6.0.21库文件不存在,则需要按照下面的步骤编译新版本的GCC,然后再创建软链接
5.1 下载GCC
GCC 各版本的下载地址
https://ftp.tsukuba.wide.ad.jp/software/gcc/releases/
# 下载文件(117M)
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.bz2# 解压文件
$ tar -xvf gcc-5.2.0.tar.bz2# 进入解压目录
$ cd gcc-5.2.0# 下载编译gcc所需的依赖文件和库
$ ./contrib/download_prerequisites#********************************#如果./contrib/download_prerequisites执行报错,按下执行#wget http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2
#wget http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2
#wget http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
#wget http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2#**********************************# 建立输出目录,用于存放编译时所有产生的中间文件
$ mkdir gcc-temp# 进入输出目录
$ cd gcc-temp# 执行configure配置
$ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib# 编译gcc,指定编译使用的线程数为8,编译耗时较长,可能需要几个小时
$ make -j8# 这里为了避免影响系统的稳定性,暂时不执行"make install"和替换系统默认版本的gcc
5.2 建立软连接
# 进入输出目录
$ cd gcc-temp# 查找编译生成libstdc++.so库文件,下面查找到的libstdc++.so、libstdc++.so.6都只是软链接文件,libstdc++.so.6.0.21才是真正编译生成的库文件
$ find . -name "libstdc++.so*"
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21# 拷贝libstdc++.so.6.0.21库文件到lib64目录
$ cp ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64# 进入lib64目录
$ cd /usr/lib64# 删除旧的链接文件
$ rm -f libstdc++.so.6# 创建新的链接文件
$ ln -s libstdc++.so.6.0.21 libstdc++.so.6# 查看最终的libstdc++.so库文件列表
$ ls -al /usr/lib64/libstdc++.so.6*
lrwxrwxrwx. 1 root root 19 3月 12 10:08 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x. 1 root root 991616 10月 30 14:39 /usr/lib64/libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 11485880 3月 12 10:01 /usr/lib64/libstdc++.so.6.0.21
5.3 验证
见4.2
##【参考】
1、gcc full list of versions :https://ftp.tsukuba.wide.ad.jp/software/gcc/releases/
2、报错信息ImportError: /lib64/libstdc++.so.6: version CXXABI_1.3.9' not found (required by............) https://www.cnblogs.com/jimlau/p/13263052.html 3、 解决/usr/lib/libstdc++.so.6: version
GLIBCXX_3.4.14’ not found问题
https://blog.csdn.net/xiaolong2w/article/details/23915171
4、Fix the error: CXXABI 1.3.9 not found on CentOS 7 running DirectAdmin
https://azdigi.com/blog/en/webserver-panel-en/directadmin-en/fix-the-error-cxxabi-1-3-9-not-found-on-centos-7-running-directadmin/
5、Linux解决libstdc++的版本问题
https://blog.csdn.net/u013934914/article/details/104926415
6、libstdc++.so.6: version GLIBCXX_3.4.X 没有找到的解决办法
https://zhuanlan.zhihu.com/p/142718039
7、full version 对应关系:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
8、Atlas 900 PoD (Model 9000) 22.0.0 Cluster Delivery Guide
https://support.huawei.com/enterprise/en/doc/EDOC1100289998/326e1dc5/installing-gcc-730