c ++:如何找到哪个标准库包含缺少的外部符号?

时间:2017-06-01 00:17:25

标签: c++ visual-c++ visual-studio-2015 external symbols

我正在VS2015中构建一个使用第三方库的项目。我正在使用的第三方库应该与VS2015(x64)兼容,因此它应该与我的项目兼容。我的项目设置还将“忽略默认库”设置为NO。

除了链接器错误之外,所有内容都会构建查找,最后由第三方库引起:

LNK2001 unresolved external symbol "__declspec(dllimport) char const * __cdecl std::_Winerror_map(int)" (__imp_?_Winerror_map@std@@YAPEBDH@Z)

我不知道哪个.lib包含了这个“_Winerror_map”函数,但是我设法找到了源代码的位置:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\crt\src\stl\sysError.cpp

我尝试在我的项目中简单地包含该文件,但是我收到以下错误:

Error   C2491   'std::_Winerror_map': definition of dllimport function not allowed

如何确定此源文件包含在哪个默认lib中?

1 个答案:

答案 0 :(得分:0)

在Windows上构建时,有许多不同的构建版本(例如dll vs static)和构建类型(debug vs release)和平台(x86,x64)。

这些为编译过程带来了许多复杂性,微软试图使用编译指示来解决这个问题

 #if defined( _DEBUG )
 #   pragma comment ( lib, "steves_debug.lib") 
 #else
 #   pragma comment ( lib, "steves_release.lib" )
 #endif

comment (lib描述了添加到.obj的信息,以确保将正确的库自动添加到链接命令中。

可以通过与/nodefaultlib关联来覆盖此内容。这是一个坏主意,因为其中一些变体依赖于在maindllMain之前运行的代码,以确保它们没有泄漏。

在编译阶段,MSVC运行时dll通常由supply / MT [d] / MD [d]引入。https://stackoverflow.com/a/5883909/1701316