【问题标题】:LNK 2001 and LNK 2019 errors occurring between linked DLLs ONLY when using 64-bit (x64) build platform on Visual Studio C++ MFC Desktop Application仅当在 Visual Studio C++ MFC 桌面应用程序上使用 64 位 (x64) 构建平台时,链接的 DLL 之间才会出现 LNK 2001 和 LNK 2019 错误
【发布时间】:2021-03-20 11:06:26
【问题描述】:

标题基本上涵盖了它。

这些 DLL 似乎在链接器属性页设置中链接得很好,因为它们在使用 32 位构建平台时链接没有问题。

我已经在网上查看了这两个 LNK 错误,但没有找到任何能够专门解决问题的方法。

以前有没有人见过这个,或者有没有人想过如何解决这个问题?

以下是几个错误示例:

Error
LNK2001
unresolved external symbol "public: class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > __cdecl CUserContext::GetUserDisplayName(void)" (?GetUserDisplayName@CUserContext@@QEAA?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@XZ)
ApplicationIMPLDLL

Error
LNK2019
unresolved external symbol "public: int __cdecl CDBManager::IsOpen(void)" (?IsOpen@CDBManager@@QEAAHXZ) referenced in function "public: __cdecl CApplicationIMPLManager::CApplicationIMPLManager(class CDBManager *)" (??0CApplicationIMPLManager@@QEAA@PEAVCDBManager@@@Z)
ApplicationIMPLDLL

【问题讨论】:

  • 请发布完整错误信息。
  • 在原始帖子中添加了一些示例。完整列表大约有 50 个错误,因此太长无法发布,但其余错误非常相似。
  • 第一个错误表明您没有链接到(正确的)MFC 库,第二个错误是关于其他一些库。这仍然不够详细,无法猜测出什么问题。 32 位构建良好的事实可能是一个线索,但是 .lib 依赖项是在 VS 中按配置定义的,而 64 位配置显然缺少一些东西。

标签: c++ visual-studio mfc 64-bit linker-errors


【解决方案1】:

根据 Microsoft Docs,lnk2019 和 lnk2001 的原因有一个:

您尝试将 64 位库链接到 32 位代码,或将 32 位库链接到 64 位代码

链接到您的代码的库和目标文件必须编译为 与您的代码相同的架构。确保你的图书馆 项目参考是为与您的相同架构编译的 项目。确保 /LIBPATH 或其他库目录 属性指向为正确架构构建的库。

based on that fact that they link without issue when using the 32-bit build platform这句话好像说明你的dll是32位的。如果是这样,Windows 无法将 32 位 dll 加载到 64 位进程中。

如果你有这些dll的源代码,你可以将它们编译成64位。

当然,还有一种方法可以将 32 位 dll 加载到 64 位程序中。您可以参考此link 了解更多详情。

【讨论】:

  • 链接器不关心 DLL。它从导入库、LIB 文件中提取数据。
  • @IInspectable,Link error 2001表示找不到lib文件或不正确。您无法将 32 位库与 64 位可执行文件或 DLL(或 32 位可执行文件与 64 位 DLL,反之亦然)链接。是否为 64 位目标重新构建了 DLL?
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 2021-08-15
  • 2014-05-13
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多