2

我一直在寻找解决问题的方法,只是得到了一些线索,但我找不到任何一致的解决方案:我有一个动态库 (libdyna.so) 的代码,它使用 3 个静态库 (libone.so) 的功能。 a、libtwo.a、libthree.a) 和 log4cpp 库。当我第一次构建它时一切看起来都很好,我可以制作'libdyna.so',但是当你用我的java测试程序通过一个包装器(jni包装器工作正常)测试它时,我得到了很多未定义的引用。

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

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

我认为解决方案必须类似于在我想制作动态链接器时向链接器添加一些标志,但我真的不知道。谁能帮助我,或者告诉我一些想法?如果需要一些代码,请告诉我,我会在这里粘贴。非常感谢。

P/D:对不起我的英语不好。

4

1 回答 1

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 之前也很重要。它可能是您问题的替代解决方案。

于 2011-05-02T18:45:01.300 回答