2010-09-26 87 views
0

问候, 我希望有人有耐心来读这个。我手边有一个设置,这有点让我困惑。我有一个由Eiffel编译器生成的C源代码目录。 我想使用Java的这个输出,所以我需要一个JNI的DLL,我将在其中实现一些JNI函数。当我编译C代码时,它给了我一个静态库,它依赖于其他一些库。所以,我的设置是:链接到一个链接到静态库和其他共享库的DLL的正确方法是什么?

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++应用程序中包含它两次。我也对两次包含同一个图书馆感到紧张。在运行时如何处理事情?这能否以意想不到的方式咬我?

您的建议,以管理这个设置将不胜感激。

问候

谢雷夫

回答

0

如果你的“第二” DLL不能因为在静态库中声明的符号链接,似乎无论是第二DLL不应该看到,符号(为什么它),它也依赖于静态库。

看来后者是不需要的,所以你应该尝试找出链接器通过哪条路径找到不需要的符号。可能通过头文件编译器看到包括您的DLL的头文件时...

0

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