在库中使用 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.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 Form,了解有关构建 C 和 C++ 代码时发生的情况的更多详细信息。
关于[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 时,可执行文件中出现链接器错误的主要内容,如果未能解决你的问题,请参考以下文章
在库中使用 .Net Standard 1.4 和在应用程序中使用 .Net framework 4.6.1 时,无法加载文件 System.IO.FileSystem,Version=4.0.1.0