Linux解决libstdc++的版本问题

  • A+
所属分类:教程分享

version `CXXABI_1.3.8' not found

version `GLIBCXX_3.4.21' not found

两者是一个问题导致的:

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

查看当前 GCC 的版本

  1. # strings /usr/lib64/libstdc++.so.6 | grep GLIBC
  2. GLIBCXX_3.4
  3. GLIBCXX_3.4.1
  4. GLIBCXX_3.4.2
  5. GLIBCXX_3.4.3
  6. GLIBCXX_3.4.4
  7. GLIBCXX_3.4.5
  8. GLIBCXX_3.4.6
  9. GLIBCXX_3.4.7
  10. GLIBCXX_3.4.8
  11. GLIBCXX_3.4.9
  12. GLIBCXX_3.4.10
  13. GLIBCXX_3.4.11
  14. GLIBCXX_3.4.12
  15. GLIBCXX_3.4.13
  16. GLIBCXX_3.4.14
  17. GLIBCXX_3.4.15
  18. GLIBCXX_3.4.16
  19. GLIBCXX_3.4.17
  20. GLIBCXX_3.4.18
  21. GLIBCXX_3.4.19
  22. GLIBC_2.3
  23. GLIBC_2.2.5
  24. GLIBC_2.14
  25. GLIBC_2.17
  26. GLIBC_2.3.2

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

  1. # 查找库文件
  2. # find / -name libstdc++.so.6.0.21
  3. # 如果libstdc++.so.6.0.21库文件已存在,则按照下面的步骤创建软链接即可
  4. # 如果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 版本根据自己的需要进行选择。

  1. # 下载文件(117M)
  2. # wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.bz2
  3. # 解压文件
  4. # tar -xvf gcc-5.2.0.tar.bz2
  5. # 进入解压目录
  6. # cd gcc-5.2.0
  7. # 下载编译gcc所需的依赖文件和库
  8. # ./contrib/download_prerequisites
  9. # 建立输出目录,用于存放编译时所有产生的中间文件
  10. # mkdir gcc-temp
  11. # 进入输出目录
  12. # cd gcc-temp
  13. # 执行configure配置
  14. # ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
  15. # 编译gcc,指定编译使用的线程数为8,编译耗时较长,可能需要几个小时
  16. # make -j8
  17. # 这里为了避免影响系统的稳定性,暂时不执行"make install"和替换系统默认版本的gcc

建立软链接

  1. # 进入输出目录
  2. # cd gcc-temp
  3. # 查找编译生成libstdc++.so库文件,下面查找到的libstdc++.so、libstdc++.so.6都只是软链接文件,libstdc++.so.6.0.21才是真正编译生成的库文件
  4. # find . -name "libstdc++.so*"
  5. ./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
  7. ./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
  8. ./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
  9. ./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
  10. ./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
  11. ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
  12. ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
  13. ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
  14. # 拷贝libstdc++.so.6.0.21库文件到lib64目录
  15. # cp ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64
  16. # 进入lib64目录
  17. # cd /usr/lib64
  18. # 删除旧的链接文件
  19. # rm -f libstdc++.so.6
  20. # 创建新的链接文件
  21. # ln -s libstdc++.so.6.0.21 libstdc++.so.6

验证新的 libstdc++.so.6.0.21 库文件是否生效

如果下面的输出结果中,出现 GLIBCXX_3.4.21,则代表新的 libstdc++.so.6.0.21 库文件生效。

  1. # strings /usr/lib64/libstdc++.so.6 | grep GLIBC
  2. GLIBCXX_3.4
  3. GLIBCXX_3.4.1
  4. GLIBCXX_3.4.2
  5. GLIBCXX_3.4.3
  6. GLIBCXX_3.4.4
  7. GLIBCXX_3.4.5
  8. GLIBCXX_3.4.6
  9. GLIBCXX_3.4.7
  10. GLIBCXX_3.4.8
  11. GLIBCXX_3.4.9
  12. GLIBCXX_3.4.10
  13. GLIBCXX_3.4.11
  14. GLIBCXX_3.4.12
  15. GLIBCXX_3.4.13
  16. GLIBCXX_3.4.14
  17. GLIBCXX_3.4.15
  18. GLIBCXX_3.4.16
  19. GLIBCXX_3.4.17
  20. GLIBCXX_3.4.18
  21. GLIBCXX_3.4.19
  22. GLIBCXX_3.4.20
  23. GLIBCXX_3.4.21
  24. GLIBC_2.3
  25. GLIBC_2.2.5
  26. GLIBC_2.14
  27. GLIBC_2.17
  28. GLIBC_2.3.2
  29. 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

大功告成!完事!

  • 交流群
  • 扫一扫和我一起交流
  • weinxin
  • QQ游戏群
  • 扫一扫和我一起游戏
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: