在库中使用 fstream 时,可执行文件中出现链接器错误

Posted

技术标签:

【中文标题】在库中使用 fstream 时,可执行文件中出现链接器错误【英文标题】:When using fstream in a library I get linker errors in the executable 【发布时间】:2011-12-16 00:26:58 【问题描述】:

当我添加时

#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

有什么想法吗?

【问题讨论】:

当你添加#include什么? 在我看来,您链接到了错误的 CRT。您是如何创建项目的? 【参考方案1】:

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

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

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

这样更好,我们可以简化重现行为所需的环境。您可以切换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 Form,了解有关构建 CC++ 代码时发生的情况的更多详细信息。

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

尺寸明显变大 跑得慢

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

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

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

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

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

此外,请确保在应该协同工作的项目之间保持一致的设置。

【讨论】:

【参考方案2】:

对于像我这样的人,这个答案没有帮助,第二个选择是去: Project Properties->Configuration Properties->General->Project Defaults->.NET Target Framework Version并将其设置为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 团队的晦涩答案,解决了我的问题。

我也将此答案添加到同一问题的另一个版本。

【讨论】:

以上是关于在库中使用 fstream 时,可执行文件中出现链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

线程在完成执行代码之前在动态库中中止

在库中处理 Posix 信号

在库中使用 .Net Standard 1.4 和在应用程序中使用 .Net framework 4.6.1 时,无法加载文件 System.IO.FileSystem,Version=4.0.1.0

在库中搜索 mangle

Angular Schematics:在库中运行单元测试时出错

arcgis在库中怎么搜索选中