使用主可执行文件中定义的函数的 .dll 插件

Nag*_*aga 6 c++ dll plugins undefined-reference visual-studio-2012

我有一个加载 . dll/.so插件,它在 Linux 中工作得很好,但在 Windows(Visual Studio 2012)上,它因未定义的引用错误而失败。

该插件使用session->SendLine("bla")在 Main 可执行文件中定义的函数。(在插件中包含的 .h 中定义的会话 ans 方法类,但在 main exec 中编译的 .cpp 中的实际功能)。

tl; dr:“我需要 Windows 链接器忽略插件中未定义的引用,在主可执行文件中定义”

在 Windows 中“使其工作”但在没有百万#ifdef的情况下保持与 Linux 兼容的最佳方法是什么?

Dav*_*nan 5

在 Windows 上链接库的处理方式与在 Linux 上的处理方式完全不同。从插件链接到主机可执行文件在 Linux 上很简单,但在 Windows 上就不是那么简单了。

在 Windows 上,链接到外部模块的传统方法是使用由 .lib 文件提供的导入库。为了做到这一点,您需要为可执行文件创建一个导入库,其中包含插件需要调用的所有导出函数。我从未为可执行文件创建导入库。通常,您为 DLL 执行此操作。我什至不确定它是否适用于可执行文件。

其他一些选择:

  1. 从可执行文件中导出函数,并GetProcAddress在您的插件中使用以在运行时绑定到它们。
  2. 当您初始化插件时,传递一个包含它们需要的所有功能的接口。