解决Centos下libstdc++.so.6: version `GLIBCXX_版本号' not found 和 libc.so.6: version `GLIBC_版本号' not found

问题:

Centos里由于 glicxx 库和 glic 库版本低,不能运行别的 Centos 编译好的 C++ 程序
在这里插入图片描述可通过strings /lib64/libc.so.6 | grep GLIBC_查看系统 GLIBC 支持的版本
可通过strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX查看系统 GLIBCXX 支持的版本

笔者系统支持的版本:

解决Centos下libstdc++.so.6: version `GLIBCXX_版本号' not found 和 libc.so.6: version `GLIBC_版本号' not found_第1张图片 解决Centos下libstdc++.so.6: version `GLIBCXX_版本号' not found 和 libc.so.6: version `GLIBC_版本号' not found_第2张图片

原因

  • Centos为求稳定,其系统自带的 GLIBC 和 GLIBCXX 版本太低,软件编译时使用了较高版本,运行时不兼容导致。
  • GLIBC 是 GNU 发布的 C 运行库,GLIBC 是 Linux 系统中最底层的 API,几乎其它任何运行库都会依赖于GLIBC。GLIBC 除了封装 Linux 操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
  • 很多 Linux 的基本命令,比如cp, rm, ll,ln等,都得依赖于它,如果操作错误或者升级失败会导致系统命令不能使用,严重的造成系统退出后无法重新进入,所以操作时候需要慎重。

解决方法:更新 GLIBC 和 GLIBCXX,修改/usr/lib64中libstdc++.so.6链接到新库即可(GLIBC 对应/lib64/libc.so.6)

方法很多,只要该库更新到最新即可:

  • 可通过手动更新 GCC,下载并编译GCC,将 GCC 升级到4.8版本,把里面的库替换掉现有的
  • 可以在 CSDN 搜一下这两个库,直接下载即可,不过要一点积分

这里介绍一下亲测可行的一种方法。

下载并更新 GLIBC

上面的信息可以看出,查看系统信息可知最高只有GLIBC_2.12,而程序需要 GLIBC_2.14。http://ftp.gnu.org/gnu/glibc/ 里有一应俱全的 glic 版本,笔者选择了 2.18

下载需要的 glic 版本

wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz

解压

tar -xvf glibc-2.18.tar.gz

创建编译目录

mkdir glibc-build-2.18

进入目录并配置

cd glibc-build-2.18
…/glibc-2.14/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

编译(时间有点长,半小时左右)

make -j4

编译成功后会在当前glibc-build-2.18目录下生成一个新的libc.so.6的软连接,指向的是本目录下的libc.so文件,已经差不多大功告成了,可以自己替换掉/lib64下的软链接,也可以采用更方便的做法:

make install

注意:
1.这里最好用 root 用户或者 sudo 运行,否则可能会因为没有操作权限而 make 失败
2.如果升级失败,发现ls,cp,rm等命令不能用了,使用”LD_PRELOAD=/lib64/libc-2.12so ls“的方式运行命令,因为libc.so.6这个软链接被删除了,系统会因为找不到库而没法用各种命令,“LD_PRELOAD”是一个环境变量,定义在程序运行前优先加载的动态链接库,这样命令就可以正常使用了。

再次查看系统的 GLIC 版本:

解决Centos下libstdc++.so.6: version `GLIBCXX_版本号' not found 和 libc.so.6: version `GLIBC_版本号' not found_第3张图片

下载并更新 GLIBCXX

上面的信息可以看出,查看系统信息可知最高只有GLIBCXX_3.14.13,而程序需要 GLIBCXX_3.14.19。http://ftp.de.debian.org/debian/pool/main/g/gcc-4.9/选择自己需要的libstdc++版本。笔记选择了 libstdc++6_4.9.2-10+deb8u1_amd64.deb(别问我为什么,试了很多个才找到合适的)

下载

wget http://ftp.de.debian.org/debian/pool/main/g/gcc-4.9/libstdc++6_4.9.2-10+deb8u1_amd64.deb

解压

ar -x libstdc++6_4.9.2-10+deb8u1_amd64.deb
tar -xvf data.tar.xz

解决Centos下libstdc++.so.6: version `GLIBCXX_版本号' not found 和 libc.so.6: version `GLIBC_版本号' not found_第4张图片
可以看到解压出来的文件中有一个libstdc++.so.6.0.20,这正是我们需要的东西。接下来只要把它替换掉现有的低版本的库即可

cd /usr/lib64
ll stdlibc++*

在这里插入图片描述
可以看到当前libstdc++so.6指向13的版本,接下来把刚刚的高版本的复制到这里并重建软链即可

cp ~/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 .
rm libstdc++.so.6
ln -s libstdc++.so.6.0.20 libstdc++.so.6

大功告成

参考
http://www.jiagoumi.com/work/811.html
https://blog.csdn.net/pursuit_zhangyu/article/details/79450027

你可能感兴趣的:(Linux)