1

当我添加

#include <fstream>

并尝试使用

std::ifstream (i.e. std::ifstream ifile(pDest))

在我的库中,编译使用该库的项目时出现以下链接器错误:

Error   2   error LNK2019: unresolved external symbol __CrtDbgReportW referenced in function "public: wchar_t * & __thiscall std::vector<wchar_t *,class std::allocator<wchar_t *> >::operator[](unsigned int)" (??A?$vector@PA_WV?$allocator@PA_W@std@@@std@@QAEAAPA_WI@Z) C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\Console.lib(ZipLib.obj)  TestingZipper
Error   3   error LNK2001: unresolved external symbol __CrtDbgReportW C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(stdthrow.obj) TestingZipper
Error   4   error LNK2019: unresolved external symbol __free_dbg referenced in function "private: void __thiscall std::_Yarn<char>::_Tidy(void)" (?_Tidy@?$_Yarn@D@std@@AAEXXZ) C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\Console.lib(ZipLib.obj)  TestingZipper
Error   5   error LNK2001: unresolved external symbol __free_dbg    C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(xdebug.obj) TestingZipper
Error   6   error LNK2001: unresolved external symbol __free_dbg    C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(locale0.obj)    TestingZipper
Error   7   error LNK2019: unresolved external symbol __malloc_dbg referenced in function "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(xdebug.obj) TestingZipper
Error   8   error LNK2001: unresolved external symbol __malloc_dbg  C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(locale0.obj)    TestingZipper
Error   9   error LNK2019: unresolved external symbol __calloc_dbg referenced in function __Getctype    C:\zipprojnotworking\CPP\7zip\UI\TestingZipper\libcpmtd.lib(_tolower.obj)   TestingZipper Error 10  error LNK1120: 4 unresolved externals   C:\zipprojnotworking\CPP\7zip\UI\Console\Debug\TestingZipper.exe    TestingZipper

任何想法为什么?

4

2 回答 2

3

5 年多后......问题(也许还有许多其他问题)已经解决(并且被遗忘了:))

您有 1 个包含上述代码的lib项目:我假设它位于.c(xx)文件中而不是.h文件中(包含在两个项目中),以及一个使用前一个项目的应用程序项目。
我已经考虑过会产生这种行为的配置是什么(lib项目构建良好,app项目具有这些未解决的外部),唯一能站起来的配置是:lib项目不正确。让我详细说明:

  • 缺少的一个符号是CrtDbgReport,它告诉我该库是在调试模式下构建的。
  • lib正在构建OK的事实告诉我:
    1. lib项目没问题,错误在app项目
    2. lib项目并不好(app项目可能好也可能不好),但它是一个静态库 - 在这种情况下,.obj文件只是在生成的.lib文件中“合并”在一起 - 它没有链接,所以链接器此时不会搜索未解析的外部对象,它只会在此库链接到可执行文件(.exe.dll)时进行搜索。这是因为我在错误日志中看到了libcpmtd.lib (1):使用静态运行时库 ((U)CRT)版本(尤其是在包含库的项目中)仅在构建静态应用程序时才有意义(通常设计为在剥离环境中运行 - 例如在“ Windows 简约核心”发行版上,它可能只需要核心库,例如:ntdll.dll , kernel32.dll , ...)。
  • 链接时(应用程序项目)没有重复符号的事实排除了第一个选项。

这样更好,我们可以简化再现行为所需的环境。您可以切换Project Properties -> Configuration Properties -> General -> Configuration Type并从Static Library (.lib)更改为Dynamic Library (.dll)。现在,最后它将链接并且在构建lib项目时将无法吐出错误。

1检查[SO]: Errors when linking to protobuf 3 on MSVC 2013有关 CRT 链接类型的详细信息(也请检查链接)。另请检查[SO]: LNK2005 Error in CLR Windows FormCC++代码时发生的情况的更多详细信息

关于[MSDN.Blogs] 的几句话: Debug vs Release builds:在Debug模式下构建时,一些检测代码会默默地添加到您的代码中以方便调试。这就是为什么Debug构建工件(它们的Release对应物相比):

  • 有明显更大的尺寸
  • 跑得慢

代码添加通常通过构建步骤之间的差异来实现(简化版):

  • 预处理:定义了_DEBUG宏(与定义NDEBUGRelease相对)。您可以浏览标准包含文件,并且您会在这些宏上看到许多预处理器指令(主要是#ifdef s)。这个阶段对编译阶段有直接影响
  • 链接:选择正确的库(实际上包含该检测代码)

最重要的是编译(间接地,预处理)和链接阶段必须同步对于您的lib项目,情况并非如此,因此您的UCRT不匹配(如第 3 条评论所述)。要解决此问题,请执行以下任一操作

  • 更改_DEBUG / NDEBUG宏定义:项目属性 -> C/C++ -> 预处理器 -> 预处理器定义
  • 从以下位置更改UCRT类型:项目属性 -> C/C++ -> 代码生成 -> 运行时库

我列出了它们,因为我不知道哪个不正确(因为您希望配置设置与配置名称(调试/发布)匹配),但我感觉是后者。

此外,请确保在应该一起工作的项目之间具有一致的设置。

于 2017-01-09T22:45:56.683 回答
1

对于像我这样的人来说,这个答案没有帮助,第二个选择是转到: 项目属性->配置属性->常规->项目默认值->.NET 目标框架版本并将其设置为v4.0

https://connect.microsoft.com/VisualStudio/feedbackdetail/view/806238/unwarranted-linker-errors-using-stl-filestream-class-in-managed-classes-in-c-11-cli有一个模糊的答案解决了我的问题的 Microsoft 团队。

我还将这个答案添加到同一问题的另一个版本中。

于 2017-10-28T16:02:30.820 回答