1. 当前位置:网站首页 > 技术分享 > linux

Linux解决libstdc++的版本问题

version `CXXABI_1.3.8' not found


version `GLIBCXX_3.4.21' not found


两者是一个问题导致的:


c++标准库太老了.没有更新.


查看当前 GCC 的版本


# 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

GLIBC_2.3

GLIBC_2.2.5

GLIBC_2.14

GLIBC_2.17

GLIBC_2.3.2

查找 libstdc++.so.6.0.21 库文件


# 查找库文件

# find / -name libstdc++.so.6.0.21

# 如果libstdc++.so.6.0.21库文件已存在,则按照下面的步骤创建软链接即可

# 如果libstdc++.so.6.0.21库文件不存在,则需要按照下面的步骤编译新版本的GCC,然后再创建软链接

编译新版本的 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 版本根据自己的需要进行选择。


# 下载文件(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

# 建立输出目录,用于存放编译时所有产生的中间文件

# mkdir gcc-temp

# 进入输出目录

# cd gcc-temp

# 执行configure配置

# ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

# 编译gcc,指定编译使用的线程数为8,编译耗时较长,可能需要几个小时

# make -j8

# 这里为了避免影响系统的稳定性,暂时不执行"make install"和替换系统默认版本的gcc

建立软链接


# 进入输出目录

# 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.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

还有一个笨办法就是找个现成的libstdc++.so.6.0.21


 


把它拷到/usr/lib64下


删掉libstdc++.so.6这个软连接. rm -rf libstdc++.so.6


建立新连接ln -s libstdc++.so.6.0.21 libstdc++.so.6


千万别忘了ldconfig


最后看一眼:strings /usr/lib64/libstdc++.so.6 | grep GLIBC


大功告成!完事!


本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:https://www.gycww.com/wenku/txtlist_i39v.html

联系我们

在线咨询:点击这里给我发消息

微信号:76891828

工作日:9:30-18:30,节假日休息