【问题标题】:Visual C++ - Linking plugin DLL against EXE?Visual C++ - 将插件 DLL 与 EXE 链接?
【发布时间】:2010-10-20 16:46:02
【问题描述】:

我正在将大型 C++ 应用程序从 Linux (gcc) 移植到 Windows (Visual C++ 2008),并且遇到插件的链接器问题。在 Linux 上这不是问题,因为 .so 支持运行时符号查找,但 dll 似乎不支持。

一些背景资料: 托管脚本环境的应用程序(主机)为插件(在运行时通过脚本 API 调用加载的共享库)提供接口,允许在不重新编译主机应用程序的情况下扩展主机和脚本 API。在 Linux 上,这只是将主机应用程序的标头包含在插件源中的问题,但在 Windows 上,我收到链接器错误。我不确定我需要链接什么来让 Visual C++ 解析这些符号。

我们的一个依赖项(开源,LGPL)具有预处理器声明,用于将 __declspec(dllexport) 和 __declspec(dllimport) 插入其标头中。一些先前的研究表明我可能也必须这样做,但在我去修改一大堆核心头文件之前,我想确定一下。 (我之前可以在 MinGW 上完成这项工作,但我们决定支持 Visual Studio 是此类商业项目的一项要求。)

简而言之,我的问题是:如何将运行时加载的 dll 与 Visual C++ 中的主机 exe 链接起来?

编辑:为了用一个例子来说明问题,我在我的宿主应用程序中有一个类,Object,它代表了一个可以被脚本访问的对象的基本类型。在我的插件中,我有许多扩展 Object 的类来执行其他功能,例如集成网络支持或新的视觉元素。这意味着我的 dll 必须与宿主 exe 中的符号链接,我不知道该怎么做。

【问题讨论】:

  • 我在解决这个问题时遇到了一些麻烦。如果您有一个具体的示例并将其简化为几行代码,也许这可能会对每个人都有帮助。

标签: c++ visual-studio-2008 visual-c++ dll plugins


【解决方案1】:

“运行时符号查找”是什么意思?您的意思是使用dlopendlsymso on 动态加载库吗? equivalents in Windows 被称为 LoadLibraryGetProcAddress

在 Windows 中,您不能从可执行文件中导出符号。您应该只从 dll 中导出它们。解决问题的正确方法是重新架构,以便导出的符号位于可执行文件和其他插件 dll 可以链接的 dll 中。

【讨论】:

  • 就是这样,我可以做到这一点,但我不知道如何根据主机可执行文件中定义的符号编译该 dll(参见我最近的编辑)
  • 可以从 EXE 中导出符号;只需使用 GetProcAddress(GetModuleHandle(NULL), "MyProc)) 来获取它们。
  • ...但 Windows 加载程序不会自动为您执行此操作。
【解决方案2】:

你不能,很容易。 Windows 加载器的设计目的不是为了从 EXE 中导出符号并将它们绑定到 DLL 中的符号。

我见过的一种模式是 DLL 导出 EXE 调用的某个函数。它将一个结构体作为参数,该结构体包含 DLL 调用的 EXE 中函数的地址。

【讨论】:

    【解决方案3】:

    正如 1800 INFORMATION 所说,不要那样做。将对象从可执行文件中移出并放入“第三个”DLL。链接插件和可执行文件。

    【讨论】:

      【解决方案4】:

      我一直在实现相同的功能,构建了一个在 Linux 和 Windows 下构建的插件库。

      Linux下的解决方案是在gcc命令行中使用-rdynamic选项。这会导出主可执行文件中的所有符号,以便插件可以在加载时找到它们。

      在 Windows 下,解决方案是在您希望 dll 使用的 exe 中的那些函数的定义前面添加 __declspec(dllexport)。编译将为要链接的 dll 创建一个 .lib 文件。当然可以在 Visual Studio 2008 下工作。 相关帖子:https://stackoverflow.com/a/3756083/1486836

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多