CRT 库:版本错误

CRT library: wrong version

在我的应用程序(调试模式)的编译过程中,出现以下与 CRT 库相关的错误:

16>libcpmt.lib(stdhndlr.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in poStat.obj

根据 Microsoft MSDN topic,我需要将运行时库设置为 /MTd,以便附加使用调试模式编译的正确库。我还必须定义一个 _DEBUG 标志 - 这正是我所做的。

即使我已经完成了在调试模式下使用 CRT 所需的一切,它仍然试图在没有调试模式的情况下使用 CRT(libcpmt.lib 而不是 libcpmtd.lib)。

我该如何解决这个问题?


更新

当我转到 C:\Program Files\Microsoft Visual Studio 11.0\VC\lib 并将 libcpmtd.lib 的名称更改为 libcpmt.lib(不得不临时删除现有的 libcpmt.lib)时,它在调试模式。

正如 Hans Passant 已经指出的那样,出现这种情况的原因是因为您链接的某些 .lib 或 .obj 文件是使用 Release 设置编译的,而另一些是使用 Debug 设置编译的。现在真正的问题是如何找到需要修复的库或目标文件。这是一种方法

link /dump /all "Path_To_Lib_or_Obj" | findstr /L "\/DEFAULTLIB"

这将打印出所有默认库,包括 CRT。必须为链接器构建命令中出现的每个 .lib 和 .obj 执行此命令。对于调试,您应该看到类似以下内容:

/DEFAULTLIB:msvcprtd
/DEFAULTLIB:MSVCRTD
/DEFAULTLIB:OLDNAMES
...

并发布:

/DEFAULTLIB:msvcprt
/DEFAULTLIB:MSVCRT
/DEFAULTLIB:OLDNAMES
...