C++ 动态库使用静态库,将显示未定义的符号

C++ 动态库使用静态库,将显示未定义的符号,c++,c,gcc,static-libraries,dynamic-library,C++,C,Gcc,Static Libraries,Dynamic Library,我一直在寻找解决问题的方法,只是得到一些线索,但我找不到任何一致的解决方案: 我有一个动态库(libdyna.so)的代码,它使用了3个静态库(libone.a、libtwo.a、libthree.a)和log4cpp库的函数。 当我第一次构建它时,一切看起来都很好,我可以制作“libdyna.so”,但是当我用java测试程序通过一个包装器(jni包装器工作正常)对它进行测试时,我得到了很多未定义的引用 然后我将“-z defs”标志放在make文件中,出现了许多未定义的引用,我无法再次编译动

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

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

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

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


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

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

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

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

不要忘记关闭
-Wl,-没有完整的归档文件


还要检查gcc命令行中库的显示顺序,确保它们位于动态库的对象文件之后,否则链接器将不会加载它们。例如,如果libone使用libtwo,那么libone出现在libtwo之前也很重要。这可能是解决你问题的另一种方法。

哦,我的天啊。我真不敢相信你竟然没有包括那些未解决的符号的名称!你能找个时间补充一下吗?通常情况下,这是一个三秒的答案,如果已知符号,您是否也尝试添加静态库?类似于-l/path/libtwo.a和类似的其他两个。。。