【问题标题】:Trouble exporting variable from EXE to use in DLL无法从 EXE 导出变量以在 DLL 中使用
【发布时间】:2017-12-12 03:58:26
【问题描述】:

我有一个常规的 MFC 应用程序,我想从中导出一个变量并在 dll 中使用它。以下是 exe/dll 中的声明/定义摘要,应类似于 here

__declspec(dllexport) BOOL g_status; // In EXE
__declspec(dllimport) BOOL g_status; // in DLL

下面的链接器错误似乎表明由于名称修改而无法找到?

error LNK2001: unresolved external symbol "__declspec(dllimport) int g_status" (__imp_?g_status@@3HA)

然后我尝试在exe端添加extern "C"' to declaration in dll but it doesn't work because if I use C decorations on dll, the same has to be done on exe side as well but using 'extern "C"这个组合实际上forces它成为声明!

__declspec(dllexport) BOOL g_status; // in EXE
extern "C" __declspec(dllimport) BOOL g_status; // in DLL

以下链接器错误:

error LNK2001: unresolved external symbol __imp__g_status   

我有点失落。我看到很多带有函数的示例,但没有很多带有变量的示例,如何导出它们以及名称装饰是否仍在使用?

【问题讨论】:

  • 您的第一个“在 EXE 中”显示 dllimport,应该是 dllexport
  • @franji1 感谢我验证,这只是帖子中的错字,已修复。
  • 这几乎总是以循环依赖的形式结束。在链接 EXE 之前,您无法链接 DLL。但是在链接 DLL 之前,您无法链接 EXE。它是 formally possible,但 IDE 不直接支持。当然最好避免,如果您需要另一个 DLL 作为该变量的主目录,那就这样吧。您可能会发现它的更多用途。
  • @HansPassant 似乎是这样。我将不得不按照记录的here 以不同的方式链接它
  • 最好让接收 DLL 导出一个函数,然后提供的 EXE(或另一个 DLL)可以在运行时调用该函数以将所需的变量传递给 DLL。或者让接收 DLL 导出一个指针变量,然后提供的 EXE/DLL 可以导入该变量并为其分配一个内存地址。

标签: c++ dll mfc


【解决方案1】:

这确实是 Hans Passant 在评论中指出的循环依赖问题。在我的情况下,我暂时需要这个变量来帮助调试,所以我不想去弄清楚。

我最终在其中一个 dll 中声明它,并在另一个 dll 中使用它,并使用如下简单的定义/声明。

__declspec(dllexport) BOOL g_status; // In EXE
__declspec(dllimport) BOOL g_status; // in DLL

还有另外一个警告,调用者 dll 必须依赖于被调用者,否则仍然会发生链接器错误。我收到此链接器错误:

error LNK2001: unresolved external symbol "__declspec(dllimport) int g_status" (__imp_?g_status@@3HA)

当我设置 dll 依赖项时它消失了。

希望这会有所帮助。

【讨论】:

  • "当我设置 dll 依赖时它消失了。"你是什​​么意思?你能详细说明一下吗?具体来说什么是“dll依赖”以及如何做到这一点。
  • @Spade000 我不完全记得,但我认为我的意思是您需要在解决方案中设置依赖关系。使用导出符号的项目应设置为依赖于我们使用的项目。
  • 我的意思是,你在编译的时候有没有给编译器加个参数(gcc或者clang)?我不确定我可以在哪里设置你的意思。
  • @Spade000 不,在 Visual Studio 中,您只需在解决方案属性中设置项目依赖项。
  • 该死。我以为你只使用编译器。无论如何,我会去看看如何在我的 CLI 中模拟这些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多