我正在将一个大型 C++ 应用程序从 Linux (gcc) 移植到 Windows (Visual C++ 2008),但我遇到了插件链接器问题。在 Linux 上这不是问题,因为 .so 支持运行时符号查找,但 dll 似乎不支持这个。
一些背景信息: 托管脚本环境的应用程序(主机)提供插件接口(interface)(通过脚本 API 调用在运行时加载的共享库),允许在不重新编译主机应用程序的情况下扩展主机和脚本 API。在 Linux 上,这只是将主机应用程序的 header 包含在插件源中的问题,但在 Windows 上,我收到链接器错误。我不确定我需要为 Visual C++ 链接什么来解析这些符号。
我们的一个依赖项(开源,LGPL)具有预处理器声明,用于将 __declspec(dllexport) 和 __declspec(dllimport) 插入其 header 中。一些先前的研究表明我可能也必须这样做,但我想在修改一大堆核心 header 之前确定一下。 (我以前能够在 MinGW 上运行它,但我们已经决定支持 Visual Studio 是此类商业项目的要求。)
我的问题简而言之:如何将运行时加载的 dll 链接到 Visual C++ 中的主机 exe?
编辑:为了通过示例阐明问题,我的主机应用程序中有一个类 Object,它代表脚本可以访问的对象的基本类型。在我的插件中,我有许多扩展 Object 以执行其他功能的类,例如集成网络支持或新的视觉元素。这意味着我的 dll 必须与主机 exe 中的符号链接(symbolic link),我不确定该怎么做。
最佳答案
“运行时符号查找”是什么意思?您的意思是使用 dlopen
和 dlsym
和 so on 动态加载库吗? ? equivalents in Windows称为 LoadLibrary
和 GetProcAddress
。
在 Windows 中,您不会从可执行文件中导出符号。您应该只从 dll 中导出它们。解决问题的正确方法是重新构建,以便导出的符号位于可执行文件和其他插件 dll 可以链接的 dll 中。
关于c++ - Visual C++ - 将插件 DLL 链接到 EXE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770344/