错误LNK2038:检测到'_ITERATOR_DEBUG_LEVEL'不匹配:值'0'与main.obj中的值'2'不匹配

时间:2011-10-05 21:52:21

标签: c++ debugging linker

我已经阅读了很多我的问题的解决方案但没有帮助。我试过干净,重建。重新安装了视觉2010并从专业变为终极。但我仍然不知道为什么我有这个错误。 我的项目看起来像这样: 1 Exe Solution来测试我的静态库。 1 Dll Solution静态库。 转换为dll的代码使用名为ClassificationFramework的1 lib函数。我提供这个lib作为头和cpp基本上是源代码。在Exe解决方案中,我链接了我生成的库+其他一些库来运行它+ ClassificationFramework.dll。当我使用Release时,一切正常,但是当我改为Debug时(因为我想调试一些东西,我厌倦了在发布模式下跳过调试器)我得到了这个:

    2>Link:
    2>  ClassificationFramework.lib(SampleClass.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
    2>ClassificationFramework.lib(SampleClass.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(SampleNamesSet.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(SampleSet.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(DirectoryReader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    2>C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Debug\Tester.exe : fatal error LNK1319: 4 mismatches detected

当我在Release版本中构建时,我也收到了这些警告:

    1>Link:
    1>  Generating code
    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(101): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because ptimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\directoryreader.cpp(30): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring(1589): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(226): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\directoryreader.cpp(60): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(199): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\sampleset.cpp(27): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(59): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>  Finished generating code
    1>ClassificationFramework.lib(SampleSet.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleSet.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(SampleNamesSet.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleNamesSet.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(SampleClass.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleClass.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(DirectoryReader.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(DirectoryReader.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>  Tester.vcxproj -> C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\Tester.exe

我发现调试器由于pdb文件路径错误而跳过。

'Tester.exe': Loaded 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Work\Release\Tester.exe', Symbols loaded.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Tester.exe': Unloaded 'C:\WINDOWS\SysWOW64\kernel32.dll'
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_core220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcp100.dll', Symbols loaded.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcr100.dll', Symbols loaded.
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_highgui220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\user32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\secur32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\ole32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.4770_x-ww_A689AB02\comctl32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\avifil32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\winmm.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msacm32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvfw32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\shell32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\shlwapi.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\avicap32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\version.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_imgproc220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\imm32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\lpk.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\usp10.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\WinSxS\wow64_Microsoft.Windows.Common-        Controls_6595b64144ccf1df_6.0.3790.4770_x-ww_8D2E3180\comctl32.dll', Cannot find or open the PDB file
The program '[4984] Tester.exe: Native' has exited with code 0 (0x0).

当我进入Debug-> Windows->模块时,我发现他找不到那些pdb文件或其他东西。我怎么能说他这些文件在这里和这里?我试图以管理员身份运行MSvisual,但这也没有帮助。我使用microsoft服务器加载pdb文件,但也没有帮助。

20 个答案:

答案 0 :(得分:136)

在VS2010中,迭代器调试级别在调试时默认为2,在发布时禁用。您使用的其中一个dll可能在调试中关闭了迭代器调试,因为它是在较旧版本的visual studio中构建的,或者它们明确地将定义添加到项目中。

搜索_ITERATOR_DEBUG_LEVEL_SECURE_SCL删除它们或在所有项目和来源中正确设置它们并重建所有内容。

_ITERATOR_DEBUG_LEVEL = 0 // disabled (for release builds)
_ITERATOR_DEBUG_LEVEL = 1 // enabled (if _SECURE_SCL is defined)
_ITERATOR_DEBUG_LEVEL = 2 // enabled (for debug builds)

简而言之,您可能正在混合发布和调试dll。不要在调试中链接发布dll,反之亦然!

答案 1 :(得分:94)

我对这个问题做了一些更新,因为我在将旧的Visual 6项目迁移到Visual Studio 2012之后,今天在一个链接到静态库的应用程序上遇到了同样的错误。

在我的情况下,错误是我错误地使用 / MDd 而不是 / MD 编译了静态库的Release版本,而应用程序是 / MD 发布。在静态lib项目中设置正确的/ MD解决了这个问题。

这是在项目属性

中完成的
  • 在树中选择配置属性/ C C ++ /代码生成
  • 并且选项运行时库在所有依赖项目和应用程序上设置为相同。

答案 2 :(得分:19)

如果您希望将Release中的项目A与Debug中的另一个项目B进行故意链接,那么为了在调试时保持应用程序的整体性能优势,您可能会遇到此错误。您可以通过临时修改项目B的预处理程序标志来禁用迭代器调试(并使其与项目A匹配)来解决此问题:

在Project B的“Debug”属性中,Configuration Properties - > C / C ++ - >预处理器,将以下内容添加到预处理器定义:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

在Debug中重建项目B,然后在Release中构建项目A,它应该正确链接。

答案 3 :(得分:10)

项目之间的不匹配:一个是多字节字符集,另一个是Unicode。纠正这些以达成一致意见就更正了这个问题。

答案 4 :(得分:9)

错误可能是通过将调试版本和发布版本混合在同一个可执行文件或dll中引起的。

    在vs配置管理器中,
  1. 是一些处于调试模式的项目,还有一些处于发布模式?
  2. 是您的一个发布项目是否已定义预处理程序符号DEBUG或_DEBUG?
  3. 是您的一个调试项目是否已定义预处理器符号NDEBUG?

答案 5 :(得分:7)

我也有这个问题。

我的问题是我从我的调试配置中复制/粘贴了库包含目录。

所以项目“Indep”包括来自“../Debug”的静态库“Dep.lib”,即使在发布中也是如此。修复是将库目录更改为“../Release”,因此我捕获了发布版本的库,而不是之前构建的调试库。

答案 6 :(得分:3)

尝试在C ++项目属性中将_DEBUG更改为NDEBUG宏定义(对于Release配置) 配置属性 - > C / C ++ - >预处理器 - >预处理器定义

答案 7 :(得分:2)

就我而言,对于Debug和Release,解决方案是清理然后重建整个解决方案。

编辑:我的情况也是如此(VS2017) 第一步:清理项目。 step2:更改配置模式(从调试到发布,反之亦然)。 第3步:清理项目。 step4:构建所需的配置模式。

PS:要更改配置模式,请在构建菜单下找到配置设置

答案 8 :(得分:2)

opencv_core245.lib(dxt.obj):错误LNK2038:检测到不匹配' _ITERATOR_DEBUG_LEVEL':值' 0'不匹配价值' 2'在test.obj中我得到了这样的错误。
我在链接器中有opencv_core245.lib和opencv_core245d.lib->输入 - >其他依赖项。由于这两个是confilicting我删除了第一个opencv_core245.lib。错误消失了。

答案 9 :(得分:2)

最后的机会(如果其他方式不起作用): 在所有项目中定义_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH宏。它将禁用" #pragma detect_mismatch" CRT标题中使用的功能。

答案 10 :(得分:2)

试试这个: 转到项目属性 - > C / C ++ - >代码生成 - >运行时库 从组合框值中选择:多线程DLL(/ MD) 它对我有用:)

答案 11 :(得分:1)

我在调试库和发布库之间有同样的问题。 错误在于解决方案属性/配置属性/配置。

项目配置与主配置/平台不匹配。

答案 12 :(得分:1)

我在纠正"附加图书馆目录"时解决了我的麻烦,这一点在指示" $(SolutionDir)\ Release"时出错了,我在" $中更改了它(SolutionDir)\ $(IntDir)"

要更正它,请打开项目属性 - >配置属性 - >链接器 - >一般 - >附加图书馆目录

我希望这会帮助一些有同样麻烦的人;)

答案 13 :(得分:1)

我设法通过将依赖库更改为Project Properties中的调试版本来解决此错误(在我的情况下使用Ogre3D + Bullet) - >链接器 - >输入 - >附加依赖项(VC10)。

我将BulletCollision.lib更改为BulletCollision_debug.lib(用于调试配置)并进行了编译。

答案 14 :(得分:1)

今天我遇到了同样的问题(VS2010),我建立了Release | Win32,然后尝试构建Debug | Win32,得到了这条消息。

我试过清理Debug | Win32但错误仍然存​​在。 然后我清理了Release | Win32,然后清理Debug | Win32,然后它构建得很好。

答案 15 :(得分:0)

在我的情况下,“预处理器定义”中的NDEBUG宏定义需要更改为_DEBUG。我正在构建一个静态库,用于.exe,它抱怨问题中列出的相同错误。转到配置属性(“项目”菜单,“属性”菜单项),然后单击C / C ++部分,然后单击其下的预处理器部分,然后编辑预处理器定义,以便将NDEBUG更改为_DEBUG(以匹配设置在exe)。

答案 16 :(得分:0)

与所有其他答案一样,我查看了Configuration Properties -> C/C++ -> Preprocessor指令 在我的情况下,我在Release中正确定义了NDEBUG,但我也有:_SECURE_SCL=1

删除那个解决了问题。

答案 17 :(得分:0)

我有类似的问题,但错误的设置是在我没有来源的extern .lib文件中。如果您没有源文件,最简单的解决方法是只更改.lib文件的内容。

在编辑器中打开.lib文件(我使用PSPad,也可以使用Windows记事本)并将 _ITERATOR_DEBUG_LEVEL = 2 的所有出现替换为 _ITERATOR_DEBUG_LEVEL = 0 < / p>

答案 18 :(得分:0)

我也遇到了这个问题,因为我重新制作了项目,然后忘了在依赖项目中通过引用重新链接它。

因此它通过引用链接旧项目而不是新项目。

重要的是要知道通过引用重新添加以前链接的项目存在错误。您必须手动删除vcxproj中的引用,然后才能重新添加它。根据msdn,这是Visual Studio中的一个已知问题。

答案 19 :(得分:-1)

上述帮助的小补充: 使用VST 2017将静态库添加到较旧的VST解决方案后,我得到了不匹配错误。 VST现在为包含这两行的预编译头生成“stdfax.h”:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0