【问题标题】:c++: how to find which standard library contains missing external symbol?c++:如何找到哪个标准库包含缺少的外部符号?
【发布时间】:2017-11-01 22:54:34
【问题描述】:

我正在 VS2015 中构建一个使用 3rd 方库的项目。我使用的第 3 方库应该是 VS2015 (x64) 兼容的,所以它应该与我的项目兼容。我的项目设置也将“忽略默认库”设置为 NO。

除了我最后得到的链接器错误之外,所有的构建都找到了,这是由 3rd 方库引起的:

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

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

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

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

【问题讨论】:

  • 貌似有 MS 工具可以解决它:stackoverflow.com/questions/437432/…
  • 通常没有办法告诉你应该包含什么库。正常的方法是搜索内部文档。接下来搜索源代码并尝试找到导入所需函数的头文件,然后将其与正确的库相关联。您也可以尝试使用依赖于操作系统的工具在所有库中搜索,但在极端情况下(例如您的机器上没有库),无法确定您需要链接哪个库。
  • 确保您正在构建 C++ 应用程序(而不是 C 应用程序)并且您正在链接运行时库的 DLL 版本(/MD 选项)。您的未定义符号在所有 C++ 应用程序通常链接的标准 Microsoft C++ 运行时导入库中定义。

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


【解决方案1】:

在 Windows 上构建时,有许多不同的构建风格(例如 dll 与静态)和构建类型(调试与发布)和平台(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 通常在编译阶段通过供应 /MT[d] /MD[d] 拉入。MSDN : /MT /MD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2015-02-10
    • 2012-08-09
    相关资源
    最近更新 更多