【问题标题】:What is the right way to link to a DLL which was linked to a static library and other shared libraries?链接到链接到静态库和其他共享库的 DLL 的正确方法是什么?
【发布时间】:2010-09-26 20:04:57
【问题描述】:

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

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

我的 C++ 项目是用 Eclipse CDT 编译的,我最终得到了 1 个 dll。 我可以毫无问题地使用 Java 中的这个 DLL 它在执行过程中只需要路径中的另一个 dll。静态库中的所有代码都编译到我的 dll 中,而对我的 DLL 的 Java JNI 调用又使用此代码。

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

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

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

您对管理此设置的建议将不胜感激。

最好的问候

自我介绍

【问题讨论】:

    标签: c++ static linker shared


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 2015-10-08
        相关资源
        最近更新 更多