
最近因为原来的编译是 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 |
解决办法
升级动态库即可解决问题。因为这开发板的系统不能随便动,也不在职责之内,不便实验。具体过程可参考后面的链接。
参考
- 通用方法 解决 /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found 的问题
- Linux 解决 libstdc++ 的版本问题
- GCC官方详细版本对应关系
- 多个 gcc/glibc 版本的共存及指定 gcc 版本的编译
- C++ Standards Support in GCC
阅读量
loading...