【发布时间】:2013-08-20 12:05:24
【问题描述】:
我是 MFC 的新手。
我正在尝试在 MFC 中创建一个 DLL,它链接到另一个 DLL。
问题是当我尝试编译时,我收到一个 LNK2019 错误,因为我试图链接的 DLL 中存在一个函数。
LNK2019 是指找不到 DLL 或 DLL 内的函数。
我已经采取了所有步骤,DLL 放置在已知位置,lib 也放置在已知位置,它已添加到附加依赖项中,已应用所有正确的开关(无论如何我都知道) .
我使用过 Dependency walker,并且我知道我试图链接到的 DLL 公开了这个函数。 我还有其他使用该功能的示例,我正在尝试完全像它一样使用它。 .lib 和 .dll 是一致的,即它们彼此一致。
但错误仍然存在。
编辑 这是错误信息:
错误 2 错误 LNK2019:无法解析的外部符号 "__declspec(dllimport) public: bool __thiscall PwServer::Connect(wchar_t const *,unsigned long,unsigned long *)" (_imp?Connect@PwServer@@QAE_NPB_WKPAK@Z) 在函数中引用 “公共:bool __thiscall CPwServer::Connect(class ATL::CStringT > >,unsigned long,unsigned long *)" (?Connect@CPwServer@@QAE_NV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@@ATL@@KPAK@Z)
这是我用来访问 DLL 的调用。
bool conn = PwSrv->Connect(_T(""));
Dumpbin 导出功能:
25BE6 ?Connect@PwServer@@QAE_NPBGKPAK@Z 25BE6 __imp_?Connect@PwServer@@QAE_NPBGKPAK@Z
在将 MFC DLL 与常规 DLL 链接的情况下,是否还有其他需要处理的内容,例如添加 AFX_EXT_ 或其他内容?
请就此提出建议。 谢谢。
更新
似乎只需要将项目属性>>C/C++>>语言>>将wchar_t视为内置类型中设置的标志切换为否。我以前从来没有打扰过国旗,所以不知道。链接器错误在那里...
好的。现在我有另一个问题。 wchar_t 的切换解决了 DLL 与另一个 MFC DLL 链接的问题,但现在我的应用程序在我的 DLL 中找不到入口点。在依赖遍历器中,它显示了应用程序发送的 CString 与我的 DLL 正在接受的 Unsigned Short 之间的不匹配(可能是wchar_t 关闭的结果)
【问题讨论】:
-
用 dumpbin 检查导出函数的实际名称。是相同的 C++ 装饰和调用风格吗?当您的 DLL 无法与其他 DLL 的导出库链接时,MFC 不应出现在游戏中。
-
您用于访问此 DLL 的函数 declaration 是否与名称和调用约定一致?例如,在 C++ 中,API 名称通常为
extern "C"以避免名称混淆依赖。在您的问题中发布构建日志中的 exact 链接器错误消息内容和 DLL 的 dumpbin /exports 将有助于非常。 -
请检查上述问题中的编辑部分。谢谢。
-
是否将一个项目构建为 UNICODE 而另一个项目构建为非 UNICODE?
-
您是否也维护被调用者 dll 项目代码?如果是这样,将该项目添加到项目设置>>通用属性>>添加新参考。