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
...
在我的应用程序(调试模式)的编译过程中,出现以下与 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
...