【问题标题】:LNK2019 error One DLL linking wih MFC DLLLNK2019 错误 一个与 MFC DLL 链接的 DLL
【发布时间】: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 项目代码?如果是这样,将该项目添加到项目设置>>通用属性>>添加新参考。

标签: c++ dll mfc linker


【解决方案1】:

假设您正确地包含了 DLL 的 .lib 文件(大多数情况下,这取决于编译器设置的差异。例如 UNICODE 设置)。

  1. 通过将“显示进度”链接器设置设置为 VERBOSE 来检查 .lib 是否实际正在加载。
  2. 对 LIB 文件运行 DUMPBIN 以检查导出的函数与链接器尝试导入的函数是否相同。

即

dumpbin /ALL mylib.lib > exports.txt

如果名称装饰稍有不同,这将为您提供有关问题的线索。

【讨论】:

  • 这是我试图引用的函数的 dumpbin 导出:25BE6 ?Connect@PwServer@@QAE_NPBGKPAK@Z 25BE6 __imp_?Connect@PwServer@@QAE_NPBGKPAK@Z。错误如上主要问题 Edit 部分中给出的那样。然后库被加载。
  • 是的,它们略有不同('QAE_NPBGKPAK' 不是 'QAE_NPB_WKPAK')它们是否都使用相同版本的 Visual Studio 编译?可能的命名空间问题?
  • 看来这不是问题。所需要的只是将在属性>>C/C++>>语言>>将 wchat_t 视为内置类型中设置的标志切换为否。有趣的。我以前没有遇到过这个标志。
  • 好的。现在我有另一个问题。 wchar_t 的切换解决了 DLL 与另一个 MFC DLL 链接的问题,但现在我的应用程序在我的 DLL 中找不到入口点。在dependency walker中,它显示了应用程序发送的CString和我的DLL正在接受的Unsigned Short..之间的不匹配(可能是由于`wchar_t`关闭了)。
  • 每个设置都会影响名称装饰。一旦这些设置匹配,装饰将是相同的,你就可以开始了。
猜你喜欢
  • 2014-09-06
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2021-07-21
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多