我一直在寻找解决问题的方法,只是得到了一些线索,但我找不到任何一致的解决方案:
我有一个动态库(libdyna.so)的代码,它使用3个静态库(libone.a、libtwo.a、lib Three.a)和log4cpp库的功能。
当我第一次构建它时,一切看起来都很好,我可以制作“libdyna.so”,但是当你通过包装器(jni 包装器工作正常)用我的 java 测试程序测试它时,我得到了很多未定义的引用。
然后我将“-z defs”标志放入make文件中,出现了很多未定义的引用,我无法再次编译动态库。
我已经使用三个静态库创建了“nm”命令,它正确导出了我在 dyna 库中使用的所有函数。但是当我对包含 3 个静态库的“libdyna.so”进行 nm 操作时,我发现了未定义的符号(函数)。
我认为解决方案必须类似于当我想制作动态链接器时向链接器添加一些标志,但我真的不知道。
有人可以帮助我,或者告诉我一些想法吗?如果需要一些代码,请告诉我,我会将其粘贴到此处。
多谢。
P/D:抱歉我的英语不好。
您可以使用链接器选项--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 之前也很重要。它可能是您问题的替代解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)