使用g ++构建二进制文件时谁确定GLIBCXX_version?

问题描述 投票:2回答:1

我正在使用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用于二进制文件。

c++ g++ centos6 libstdc++
1个回答
1
投票

它取决于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 ++版本。

© www.soinside.com 2019 - 2024. All rights reserved.