从多个C ++和C对象文件生成单个.so

时间:2013-06-04 07:32:58

标签: c++ c linker dynamic-linking

假设我有一个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++联系起来,它现在有效。感谢。

1 个答案:

答案 0 :(得分:1)

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