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 错误

部署vc2008开发的程序(三种办法,但是我觉得这种办法最不好)

为较低版本的 Visual Studio 构建 .dll

编译最新版本的OpenCV