linux libstdc++

Linux 程序 libstdc++ 版本错误的问题

Posted on 2022-03-24,4 min read
封面图

最近因为原来的编译是 GCC 4.7.3,版本太低,不能完全支持 C++11,因此改为使用 GCC 4.8.3 来编译程序,发现因为库版本太低,运行不起来。经过实验和查找资料,把一些相关内容记录下来。

错误提示信息

错误提示信息显示,所依赖的库 libstdc++.so.6,要求的 GLIBCXX 版本是 3.4.19,而系统上的库没找到。

root@socfpga:~# ./NetProc
./NetProc: /lib/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./NetProc)

查看当前的库版本

那如何查看板上的libstdc++.so.6版本呢,使用 strings 命令。

root@socfpga:~# strings /lib/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
GLIBC_2.4
GLIBCXX_DEBUG_MESSAGE_LENGTH

查询库对应的编译器

理论上,系统上的库是什么版本,应用程序就应该用对应版本的编译器编译,才可以匹配。那如何查看当前库是使用哪个版本的编译器编译的呢,使用 readelf 命令。

root@socfpga:~# readelf /lib/libstdc++.so.6 -p .comment
String dump of section '.comment':
  [     0]  GCC: (crosstool-NG linaro-1.13.1-4.7-2012.11-20121123 - Linaro GCC 2012.11) 4.7.3 20121106 (prerelease)

从上面命令查出来的信息可以明显看到,使用的是 GCC4.7.3 编译器编译的,因此使用 GCC 4.8.3 来编译程序,运行不起来也是正常的。

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

网上一些文章说,查看一下系统里面有没有其他高版本的库,指定高版本的库文件也许能运行起来。查找库文件的话,可以使用 find 命令,或者 locate 命令,不过当前使用的系统中没有locate命令。

root@socfpga:~# find / -name "libstdc++.so.6*"
/lib/libstdc++.so.6.0.17-gdb.py
/lib/libstdc++.so.6.0.17
/lib/libstdc++.so.6

# 或
$ locate libstdc++.so

从查找的结果来看,只包含一个版本,就是6.0.17。

版本对应关系

gcc 版本 libstdc++ 版本号 glibc 版本号 cxxabi 版本号
4.7 libstdc++.so.6.0.17 GLIBCXX_3.4.17 CXXABI_1.3.6
4.8 libstdc++.so.6.0.18 GLIBCXX_3.4.18 CXXABI_1.3.7
4.9 libstdc++.so.6.0.20 GLIBCXX_3.4.20 CXXABI_1.3.8
5.1 libstdc++.so.6.0.21 GLIBCXX_3.4.21 CXXABI_1.3.9
6.1 libstdc++.so.6.0.22 GLIBCXX_3.4.22 CXXABI_1.3.10
7.1 libstdc++.so.6.0.23 GLIBCXX_3.4.23 CXXABI_1.3.11
7.2 libstdc++.so.6.0.24 GLIBCXX_3.4.24 CXXABI_1.3.11
8.1 libstdc++.so.6.0.25 GLIBCXX_3.4.25 CXXABI_1.3.11
9.1 libstdc++.so.6.0.26 GLIBCXX_3.4.26 CXXABI_1.3.12
9.2 libstdc++.so.6.0.27 GLIBCXX_3.4.27 CXXABI_1.3.12
9.3 libstdc++.so.6.0.28 GLIBCXX_3.4.28 CXXABI_1.3.12
10.1 libstdc++.so.6.0.28 GLIBCXX_3.4.28 CXXABI_1.3.12

解决办法

升级动态库即可解决问题。因为这开发板的系统不能随便动,也不在职责之内,不便实验。具体过程可参考后面的链接。

参考

  1. 通用方法 解决 /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found 的问题
  2. Linux 解决 libstdc++ 的版本问题
  3. GCC官方详细版本对应关系
  4. 多个 gcc/glibc 版本的共存及指定 gcc 版本的编译
  5. C++ Standards Support in GCC

下一篇: Gridea + github + gitee 搭建个人博客→

loading...