gpt4 book ai didi

c++ - 动态库使用静态库,出现undefined symbols

转载 作者:搜寻专家 更新时间:2023-10-31 01:57:16 24 4
gpt4 key购买 nike

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

然后我把“-z defs”标志放到make文件中,出现了很多 undefined reference ,我无法再次编译动态库。

我已经使用三个静态库创建了“nm”命令,它正确导出了我在动态库中使用的所有函数。但是当我对包含 3 个静态库的“libdyna.so”进行 nm 时,我发现了 undefined symbol (函数)。

我认为解决方案一定是在我想制作动态链接器时向链接器添加一些标志,但我真的不知道。任何人都可以帮助我,或者告诉我一些想法吗?如果需要一些代码,请告诉我,我会把它粘贴在这里。非常感谢。

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

最佳答案

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

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

man ld:

For each archive mentioned on the command line after the --whole-archive option, include every object file in the archive in the link, rather than searching the archive for the required object files. This is normally used to turn an archive file into a shared library, forcing every object to be included in the resulting shared library.

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

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

关于c++ - 动态库使用静态库,出现undefined symbols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com