ошибка LNK2038: обнаружено несоответствие для _ITERATOR_DEBUG_LEVEL: значение 0 не соответствует значению 2 в main.obj - PullRequest
115 голосов
/ 06 октября 2011

Я прочитал много решений моей проблемы, но никто не помог. Я пытался очистить, восстановить. Переустановил visual 2010 и сменил профессиональную на окончательную. Но все же я не знаю, почему у меня есть эта ошибка. Мой проект выглядит так: 1 Exe Solution для проверки моей статической библиотеки. 1 Dll Solution статическая библиотека. Код, который конвертируется в dll, использует функцию из 1 lib, которая называется ClassificationFramework. Я предоставил эту библиотеку как заголовки и 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-> Modules, я вижу, что он не может найти эти pdb-файлы или что-то в этом роде. Как я могу сказать ему, что эти файлы здесь и здесь? Я пытался запустить MSvisual от имени администратора, но это тоже не помогло. Я использовал сервер Microsoft для загрузки файлов pdb, но также не помог.

Ответы [ 20 ]

138 голосов
/ 06 октября 2011

В VS2010 уровень отладки итератора по умолчанию равен 2 в отладке и отключен в выпуске.Вероятно, в одной из используемых вами библиотек отладка итераторов отключена в режиме отладки либо потому, что она была построена в более старой версии 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 в отладке или наоборот!

96 голосов
/ 18 октября 2012

Я делаю небольшое обновление по этой проблеме, так как у меня сегодня была та же ошибка в приложении, которое связывается со статической библиотекой, после того, как я перенес старый проект Visual 6 в Visual Studio 2012.

В моем случае ошибка состояла в том, что я по ошибке скомпилировал версию выпуска статической библиотеки с / MDd вместо / MD , тогда как приложение / MD в выпуске. Установка правильного / MD в статическом проекте lib решила проблему.

Это делается в Свойства проекта

  • Выбрать Свойства конфигурации / C C ++ / Генерация кода в дереве
  • и параметр Runtime Library , установленный одинаково для всех ваших проектов зависимостей и приложений.
19 голосов
/ 14 сентября 2014

Если вы хотите целенаправленно связать свой проект A в выпуске с другим проектом B в Debug, скажем, чтобы сохранить общие преимущества производительности вашего приложения во время отладки, то вы, вероятно, столкнетесь с этой ошибкой. Это можно исправить, временно изменив флаги препроцессора проекта B, чтобы отключить отладку итератора (и сделать так, чтобы она соответствовала проекту A):

В свойствах «Отладки» проекта B, Свойства конфигурации -> C / C ++ -> Препроцессор, добавьте следующее в Определения препроцессора:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Перестройте проект B в Debug, затем соберите проект A в Release, и он должен правильно связать.

10 голосов
/ 06 сентября 2012

У меня было несоответствие между проектами: один с многобайтовым набором символов, другой с Unicode.Исправление этих ошибок для согласования Unicode решило проблему.

9 голосов
/ 03 мая 2012

Ошибка может быть вызвана смешением отладочных сборок и сборок выпуска в одном исполняемом файле или DLL.

  1. в диспетчере конфигурации vs, некоторые из ваших проектов находятся в режиме отладки, а некоторые в режиме выпуска?
  2. один из ваших релизных проектов имеет символ препроцессора DEBUG или _DEBUG?
  3. является ли один из ваших отладочных проектов определенным символом препроцессора NDEBUG?
7 голосов
/ 19 октября 2012

У меня тоже была эта проблема.

Моя проблема заключалась в том, что я скопировал / вставил каталоги библиотеки, включенные в мои конфигурации отладки.

Таким образом, проект "Indep" включал статическую библиотеку "Dep.lib "из" ../Debug ", даже в выпуске.Исправление состояло в том, чтобы изменить каталог библиотеки на "../Release", чтобы я поймал библиотеку, собранную с релиза, а не ранее созданную библиотеку отладки.

3 голосов
/ 25 сентября 2013

Попробуйте изменить определение макроса _DEBUG на NDEBUG в свойствах проекта C ++ (для конфигурации выпуска) Свойства конфигурации -> C / C ++ -> Препроцессор -> Определения препроцессора

2 голосов
/ 27 июля 2014

Попробуйте это: Перейти к свойству проекта -> C / C ++ -> Генерация кода -> Библиотека времени выполнения Выберите из выпадающего списка значение: Многопоточная DLL (/ MD) Это работает для меня:)

2 голосов
/ 12 июня 2014

opencv_core245.lib (dxt.obj): ошибка LNK2038: обнаружено несоответствие для '_ITERATOR_DEBUG_LEVEL': значение '0' не соответствует значению '2' в test.obj Я получил такую ​​ошибку.
У меня есть opencv_core245.lib и opencv_core245d.lib в Linker-> Input-> Additional depenc. Так как эти два были в замешательстве, я удалил первый opencv_core245.lib. Ошибка исчезла.

2 голосов
/ 27 марта 2015

Последний шанс (если другие способы не работают): определите макрос _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH во всех проектах.Это отключит функцию "#pragma detect_mismatch", которая используется в заголовках CRT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...