链接器错误 LNK2038:在发布模式下检测到不匹配

Posted

技术标签:

【中文标题】链接器错误 LNK2038:在发布模式下检测到不匹配【英文标题】:Linker error LNK2038: mismatch detected in Release mode 【发布时间】:2011-05-02 23:50:46 【问题描述】:

我正在尝试将我的一个小应用程序从 Win XP 和 VS 2005 移植到 Win 7 和 VS 2010。

应用程序在调试模式下编译和运行顺利,但是在发布模式下我收到以下错误:

pcrecpp.lib(pcrecpp.obj) : error LNK2038: mismatch detected for 
'_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in LoginDlg.obj

我应该从哪里开始检查?

【问题讨论】:

你先“干净”了吗? 当您的一些项目在调试模式下编译而一些在发布模式下编译时会发生这种情况。确保它们都处于相同的模式。 顺便说一句,我做了一个干净的构建,它确实解决了问题,所以如果一些路过的读者还没有:试一试。 【参考方案1】:

您的应用正在发布模式下编译,但您链接的是 PCRE 的调试版本,该版本设置了 /MTd(或类似),从而导致 CRT 中的迭代器调试级别不匹配。

在发布模式下重新编译 PCRE 以匹配您自己的应用程序。

VS 2010 中的 detect_mismatch pragma 是导致发出此错误的原因。

见http://blogs.msdn.com/b/vcblog/archive/2009/06/23/stl-performance.aspx(搜索_ITERATOR_DEBUG_LEVEL)

【讨论】:

【参考方案2】:

我有同样的错误。在我的情况下,解决方案很简单:我有一个项目 A 依赖于另一个项目 B。B 在调试模式下有一个预处理器定义 _DEBUG 而 A 没有。

只需将 _DEBUG 添加到项目 A(project->properties->c++->preprocessor->preprocessor definitions) 即可。

【讨论】:

谢谢!或者在发布模式下,您可能在其中一个而不是另一个中定义了 NDEBUG【参考方案3】:

这也可能是由于在项目 B 中设置预处理器定义 _HAS_ITERATOR_DEBUGGING=0 而不是在 A 中设置预处理器定义,其中 A 生成 B 使用的库。

【讨论】:

如果有问题的库是第三方软件怎么办?【参考方案4】:

我的问题是依赖项目使用“使用多字节字符集” 在通用 - >字符集下。而其他项目具有“No Set”值

【讨论】:

【参考方案5】:

在我的情况下,此错误是由缺少项目引用引起的。

大概添加冲突项目作为参考允许构建系统确保构建正确的配置(调试/发布)。

【讨论】:

以上是关于链接器错误 LNK2038:在发布模式下检测到不匹配的主要内容,如果未能解决你的问题,请参考以下文章

错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“2”与 XX.obj 中的值“0”不匹配

在 VS 2012 (C++) 中编译 Visual Studio 2010 项目:错误 LNK2038:检测到“_MSC_VER”不匹配:值“1600”与值“1700”不匹配

如何用 /clr 编译 jsoncpp?

error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”

LNK2038:检测到“RuntimeLibrary”不匹配:值“MT_StaticRelease”与 file.obj 中的值“MD_DynamicRelease”不匹配

LNK2038, LNKC4743,LNK4098,LNK2001