链接到链接到静态库和其他共享库的DLL的正确方法是什么?

时间:2010-09-26 20:04:58

标签: c++ static linker shared

问候, 我希望有人有耐心阅读这篇文章。我手边有一个设置,这让我有些困惑。我有一个由Eiffel编译器生成的C源代码目录。 我想使用Java的这个输出,所以我需要一个JNI的DLL,我将在其中实现一些JNI函数。当我编译C代码时,它给了我一个静态库,它与其他一些库有依赖关系。所以我的设置是:

myDLL.dll(C ++)[取决于 - > staticLib.lib [取决于 - > (sharedlib1,sharedlib2 ...)

我的C ++项目是用Eclipse CDT编译的,我最终得到了1个dll。 我可以在没有任何问题的情况下使用Java中的这个DLL在执行期间只需要路径中的另一个dll。静态库中的所有代码都被编译到我的dll中,Java JNI调用我的DLL依次使用这个代码。

我想从另一个C ++项目中使用相同的DLL。但是,当我只链接到DLL时,链接器抱怨没有找到特定的符号。此符号在静态库中声明为extern,因此它必须位于静态库的某个依赖项中的某个位置。

我可以将DLL链接和编译到C ++项目的唯一方法是链接到静态库,它首先包含在DLL中。所以我最终得到一个.exe,它包含两次静态库:一个在DLL中,另一个在exe中。

由于Java代码成功使用了DLL,我知道静态库被编译成DLL,但我不能避免在我的C ++应用程序中包含它两次。我也很担心两次包括同一个图书馆。在运行时如何处理事情?这会以一种意想不到的方式咬我吗?

我们非常感谢您管理此设置的建议。

最好的问候

谢雷夫

2 个答案:

答案 0 :(得分:0)

如果由于静态库中声明的符号而无法链接您的“第二个”dll,则似乎第二个dll不应该看到该符号(为什么会这样),它还取决于静态库。

似乎后者是不需要的,因此您应该尝试找出链接器找到不需要的符号的路径。可能通过头文件,编译器在看到包含你的DLL标题时会看到......

答案 1 :(得分:0)

如果您为该静态库声明为extern的符号实际上并未被您为DLL编写的代码(使用静态库)所使用,那么该符号肯定不在您的DLL中(因为你的DLL不需要它。)