【发布时间】: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 可以导入该变量并为其分配一个内存地址。