CRT 库:版本错误
Posted
技术标签:
【中文标题】CRT 库:版本错误【英文标题】:CRT library: wrong version 【发布时间】:2015-01-17 14:55:36 【问题描述】:在我的应用程序(调试模式)的编译过程中,我收到以下错误,与 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
)时,它会在调试模式下成功构建。
【问题讨论】:
到目前为止,最常见的原因是您正在链接使用 Release 构建设置构建的 .lib。无法混合。 @HansPassant 没错。然而,至少据我所知,编译器在设置/MT[d]
选项时会自动链接libcpmt.lib
。所以它不可能混合。
当然,.lib 文件包含 libcpmt.lib 的特定链接指令,因为它是使用 /MT 构建的。您的代码包含 libcpmtd.lib 的特定链接指令,因为它是使用 /MTd 构建的。世界发生冲突,有人将不得不让步。如果你想调试你的代码,那么它需要是那个库。如果您无法自己重建该库,则需要联系所有者并要求进行调试构建。
如何重建libcpmt.lib
?没有这种可能性。我是项目代码的所有者,我可以在发布模式下毫无问题地编译它。
值得一提的是,我的项目在 VS 2008 中使用调试模式成功构建,升级到 VS 2012 后问题开始出现。
【参考方案1】:
正如 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 库:版本错误的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft vcredist在运行时使用的版本比清单中指定的版本高
用 pyinstaller 打包生成 exe 后,执行时出现 Failed to execute script 错误