gpt4 book ai didi

c++ - 如何确保在动态库文件中使用静态链接的 Boost

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:37 25 4
gpt4 key购买 nike

我有一个可执行文件 E,它(我假设)动态加载(dlopen)一个库文件 A.so。文件A.so动态链接B.so,是我制作的。在 B.so 中,我静态链接了许多库,例如Boost(我们称这个静态boost库为C1)。只有B完全在我的控制之下。 A 仅部分(例如,我可以添加一些链接器标志)。

似乎 E 也在动态链接旧版本的 Boost。我们称这个 Boost 库为 C2。当我运行 E 并使用来自 B 的代码时,它会解析来自 C2 的 Boost 符号(更具体地说是关于序列化库),这会导致崩溃,因为它们与静态链接 C1 的 B 中的代码不兼容。

我如何确保 B 始终使用静态链接的 Boost 库中的符号,而不是任何动态链接库中的符号?或者更一般地说,我实际上想为我静态链接到 B 的所有库确保这一点。

更多信息:

  • 我用 ldd 检查了 B 的依赖关系,它们没有引用 Boost 库。
  • 我认为问题可能是由于 C2 导出序列化符号而 B 导出弱符号(使用 nm -D 检查)。我无法更改 C2,也不确定如何隐藏 B 中的弱 Boost 符号。
  • 我使用 ld--retain-symbols-file 选项来控制我想从 B 导出哪些符号。
  • 我还尝试使用 --version-script--dynamic-list 而不是使用 --retain-symbols-file 选项。
  • 在将静态库链接到 B 时,我尝试同时使用 -Bsymbolic--whole-archive,但没有解决问题。
  • 我不想在我的代码中使用 visibility 属性,因为我希望能够使用不同的导出配置链接相同的代码。

最佳答案

你提到 B 没有动态链接任何 boost 库。因此,问题不太可能涉及 boost 符号。

您对从 B 导出的弱符号的担忧似乎被逆转了。如果 B 的导出会发生冲突,则宁可替换 C2 的符号(但是逻辑上它在 A -> B -> C1 之前加载)。我不认为这些是罪魁祸首。

还有哪些动态链接的库

具体来说,我怀疑 C/C++ 运行时库之间的 ABI 不兼容。您可能想了解主机应用程序使用了哪些编译器版本/选项。

还有,(E->A)之间的接口(interface)是C还是C++?

(A->B) 之间的接口(interface)是 C 还是 C++?

关于c++ - 如何确保在动态库文件中使用静态链接的 Boost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com