【问题标题】:Generating single .so from multiple C++ and C object files从多个 C++ 和 C 目标文件生成单个 .so
【发布时间】:2013-06-04 07:32:57
【问题描述】:

假设我有一个 C++ 库代码,其中一些定义用 extern "C" { ... } 包装。

我还有一个使用该 C++ 库的 C 库代码。

我想做的是创建一个 .so 文件,这样只需一次调用 dlopen 就足以开始使用这个库了。

这就是我现在要做的:我首先将我的 C++ 库编译为带有 -shared -rdynamic -fPIC 的 .so 文件。然后我将我的 C 库编译为具有相同参数的 .so 文件。之后,我必须在加载 C 库之前使用 dload 加载 C++ 库。否则加载失败并出现undefined symbol 错误。

我想要做的是将这两个库编译成一个 .so 文件,这样只需调用一次 dload 就足以使用它。

我该怎么做?

提前致谢。

编辑:编译为 .o 文件然后合并对我不起作用。这是我的工作:

  • 我使用 -fPIC 参数将每个文件编译为目标文件
  • 我将它们链接到clang [list of object files] -shared -rdynamic -fPIC -o libmylib.so
  • 当我尝试加载时,我收到undefined symbol: __gxx_personality_v0 错误。

EDIT2:啊,我忘了将它与libstdc++ 链接起来,它现在可以工作了。谢谢。

【问题讨论】:

  • 只需将所有目标文件作为参数粘贴到链接行吗?
  • @MatsPetersson,由于某种原因,这不起作用。在编译成目标文件时我应该使用任何额外的参数吗?
  • @sinan 这些是未解析的符号吗?如果是,您需要按特定顺序链接它们。 stackoverflow.com/q/45135/23643

标签: c++ c linker dynamic-linking


【解决方案1】:
  1. 最简单的方法是将它们组合成一个 .so 文件,方法是组合所有对象文件,或者构建两个静态 .a 库,然后将它们链接到一个共享库中。
  2. 如果您确实想保留两个.so 文件,请将第一个库链接到第二个库,就像使用可执行文件一样。例如。如果libfoo 依赖于libbar,则编译libfoo-lbar。您必须在默认库路径或 LD_LIBRARY_PATH 环境变量中包含依赖库。

【讨论】:

  • 感谢您的回答。 “您必须在默认库路径或 LD_LIBRARY_PATH 环境变量中拥有依赖库”我不希望这样,我想完全删除所有 .so,除了其中一个并且仍然能够加载它。至于您的第一个建议,我该如何组合所有目标文件?我应该使用哪些参数来编译目标文件?
  • @sinan 你如何链接你已经拥有的两个库?获取所有文件并将它们放在一个命令行中。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2011-09-28
  • 2013-04-03
相关资源
最近更新 更多