动态库使用静态库,出现未定义的符号

时间:2011-05-02 18:21:47

标签: c++ c gcc static-libraries dynamic-library

我正在寻找解决我的麻烦的方法并获得一些线索,但我找不到任何一致的解决方案: 我有一个动态库(libdyna.so)的代码,它使用3个静态库(libone.a,libtwo.a,libthree.a)和log4cpp库的函数。 当我第一次构建它时,一切都很好,我可以制作'libdyna.so',但是当我用我的java测试程序测试它虽然是一个包装器(jni包装器工作正常)但我得到了很多未定义的引用。< / p>

然后我将“-z defs”标志放到make文件中,出现了很多未定义的引用,我无法再次编译动态库。

我使用三个静态库创建了'nm'命令,它正确导出了我在dyna lib中使用的所有函数。但是当我在'libdyna.so'上创建nm时,包含3个静态库的那个,我找到了未定义的符号(函数)。

我认为解决方案必须类似于在我想制作动态链接时向链接器添加一些标志,但我真的不知道。 任何人都可以帮助我,或者告诉我一些想法吗?如果需要一些代码,请告诉我,我会将其粘贴到此处。 非常感谢。

P / D:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:3)

您可以使用链接器选项--whole-archive,它将包含整个静态库,并且可能会解决您的问题,尽管库可能会变得非常大。

g++ -shared -o libdyna.so dyna.o -Wl,-whole-archive -la -lb -lc -Wl,-no-whole-archive

man ld:

  

对于--whole-archive选项后命令行中提到的每个存档,包括存档中的每个目标文件              链接,而不是在存档中搜索所需的目标文件。这通常用于将存档文件转换为共享文件              库,强制每个对象都包含在生成的共享库中。

不要忘记关闭-Wl,-no-whole-archive

还要检查gcc命令行中库的出现顺序,确保它们位于动态库的目标文件之后,否则链接器将不会加载它们。例如,如果libone使用libtwo,那么libone在libtwo之前出现也很重要。它可能是您问题的替代解决方案。