我正在使用Centos 6.8上的G ++ 4.9.3构建一个自制的共享库。
该库使用boost :: interprocess :: file_lock,boost版本为1.41.0。
我不是在多个环境中工作..我只是使用一个设备,并且在构建库之后我从未改变构建环境。
当我构建库时,g ++很好地构建它。但是,当我通过链接二进制文件来运行它时,它显示“./a.out:/usr/lib64/libstdc++.so.6:未找到版本`GLIBCXX_3.4.15'(./libmylib.so要求)”。
所以,我检查了libstdc ++支持哪些版本,它表明它不支持高于3.4.13的GLIBCXX。 GLIBCXX_3.4.13是/usr/lib64/libstdc++.so.6支持的最新版本。
即使我正在使用某个设备并且它的libstdc ++不支持GLIBCXX_3.4.15,我的设备中的库构建也需要GLIBCXX_3.4.15。
而且即使我使用相同的编译器(g ++ 4.9.3),另一个二进制文件也不需要GLIBCXX_3.4.15。他们只是运作良好。
图书馆如何注意到它应该使用GLIBCXX_3.4.15?
源代码有什么不同吗?
编译器是否告诉库“你需要使用GLIBCXX_3.4.15,因为你在代码中使用了一些特殊的语法”?
我想知道谁确定哪个版本的GLIBCXX用于二进制文件。
它取决于GCC的版本,编译器标志和源代码。只有在程序中使用特定功能时,才会引用GLIBCXX_3.4.15
等符号。此特定符号版本的功能列表相当大。您可以使用此命令了解哪些功能相关(您必须针对较新的libstdc ++运行,即GCC 4.9附带的功能):
$ readelf -sW libstdc++.so.6 | awk '/@GLIBCXX_3.4.15/{print $8}' \
| sort -u \
| c++filt
如果你想使用Red Hat Enterprise Linux或CentOS附带的未经修改的libstdc++.so.6
版本运行程序,你可以使用Developer Toolset(也可以使用as a supported part of Red Hat Enterprise Linux。开发人员工具集通过使用旧版本来避免对新符号版本的依赖(C ++ 98) era)C ++ ABI并提供静态链接的函数副本,这些副本不属于特定目标操作系统版本的系统libstdc ++版本。