【发布时间】: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