Ошибка LNK2038: обнаружено несоответствие для _ITERATOR_DEBUG_LEVEL: значение "0" не соответствует значению "2" в main.obj
Я прочитал много решений моей проблемы, но никто не помог. Я пытался очистить, восстановить. Переустановил 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, но также не помогло.
23 ответа
В 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 релиза и отладки. Не связывайте релиз dll в отладке или наоборот!
Я делаю небольшое обновление по этой проблеме, так как у меня сегодня была та же ошибка в приложении, которое связывается со статической библиотекой, после того, как я перенес старый проект Visual 6 в Visual Studio 2012.
В моем случае ошибка состояла в том, что я по ошибке скомпилировал версию статической библиотеки Release с /MDd вместо / MD, тогда как в выпуске было / MD. Установка правильного / MD в статическом проекте lib решила проблему.
Это сделано в свойствах проекта
- Выберите Свойства конфигурации / C C++ / Генерация кода в дереве
- и параметр Runtime Library, установленный на то же самое для всех ваших проектов зависимостей и приложений.
Если вы хотите целенаправленно связать свой проект A в выпуске с другим проектом B в Debug, скажем, чтобы сохранить общие преимущества производительности вашего приложения во время отладки, то вы, вероятно, столкнетесь с этой ошибкой. Это можно исправить, временно изменив флаги препроцессора проекта B, чтобы отключить отладку итератора (и сделать так, чтобы она соответствовала проекту A):
В свойствах "Отладка" проекта B, Свойства конфигурации -> C/C++ -> Препроцессор, добавьте следующее в Определения препроцессора:
_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;
Перестройте проект B в Debug, затем соберите проект A в Release, и он должен правильно связать.
Ошибка может быть вызвана смешением отладочных сборок и выпусков в одном исполняемом файле или DLL.
- В диспетчере конфигурации VS некоторые из ваших проектов находятся в режиме отладки, а некоторые в режиме выпуска?
- В одном из ваших проектов релизов определен символ препроцессора DEBUG или _DEBUG?
- В одном из ваших проектов отладки определен символ препроцессора NDEBUG?
У меня было несоответствие между проектами: один с многобайтовым набором символов, другой с Unicode. Исправление этих проблем для согласования Unicode решило проблему.
Последний шанс (если другие способы не работают): определите макрос _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH во всех проектах. Это отключит функцию "#pragma detect_mismatch", которая используется в заголовках CRT.
У меня тоже была эта проблема.
Моя проблема заключалась в том, что я скопировал / вставил каталоги включения библиотеки из своих конфигураций отладки.
Так что проект "Indep" включал статическую библиотеку "Dep.lib" из "../Debug", даже в релиз. Исправление состояло в том, чтобы изменить каталог библиотеки на "../Release", чтобы я поймал библиотеку, собранную с релиза, а не ранее созданную библиотеку отладки.
У меня была такая же проблема между библиотеками отладки и выпуска. Ошибка была в свойствах решения / свойствах конфигураций / конфигурациях.
Конфигурации проектов не соответствуют основной конфигурации / платформе.
Попробуйте изменить определение макроса _DEBUG на NDEBUG в свойствах проекта C++ (для конфигурации выпуска). Свойства конфигурации -> C/C++ -> Препроцессор -> Определения препроцессора
Небольшое дополнение к приведенной выше справке: я получил ошибку несоответствия после добавления статической libto в старое решение VST, использующее VST 2017 . VST теперь генерирует "stdfax.h" для предварительно скомпилированных заголовков, содержащих эти 2 строки:
// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
Попробуйте это: Перейти к свойству проекта -> C/C++ -> Генерация кода -> Библиотека времени выполнения. Выбрать из выпадающего списка значение: Многопоточная DLL (/MD) Это работает для меня:)
В моем случае для Debug и Release решение заключалось в том, чтобы очистить, а затем перестроить все решение.
Edit: true в моем случае также (VS2017) step1: очистить проект. шаг 2: изменить режим конфигурации (с отладки на выпуск или наоборот). Шаг 3: очистить проект. Шаг 4: встроить в нужный режим конфигурации.
PS: чтобы изменить режим конфигурации, найдите настройки конфигурации в меню сборки
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. Ошибка исчезла.
Я решил свою проблему с исправлением "Каталога дополнительных библиотек", этот был неверным при указании "$(SolutionDir)\Release", я изменил его в "$(SolutionDir)\$(IntDir)"
Чтобы исправить это, откройте свойства вашего проекта -> Свойства конфигурации -> Компоновщик -> Общие -> Каталог дополнительных библиотек
Я надеюсь, что это поможет некоторым людям с такой же проблемой;)
У меня была такая же проблема сегодня (VS2010), я построил релиз | Win32, затем попытался построить Debug | Win32, и получил это сообщение.
Я пытался очистить Debug | Win32 но ошибка все еще сохраняется. Я тогда убрал релиз | Win32, затем убрал Debug | Win32, а затем он построен нормально.
Мне удалось избавиться от этой ошибки (в моем случае, используя Ogre3D + Bullet), изменив библиотеки зависимостей на версии отладки в Свойствах проекта -> Компоновщик -> Ввод -> Дополнительные зависимости (VC10).
Я изменил BulletCollision.lib на BulletCollision_debug.lib (для настройки отладки), и он скомпилирован.
один из проектов настроен на отладку, а другие настроены на выпуск в диспетчере конфигурации.. был потерян во всех других настройках.
Для меня это просто проблема со свойствами, изменение C/C++/генерации кода/MDd на MD решило ее.
То же. Я связывал библиотеку уровня выпуска с Debug EXE.
Причина проблемы: я включил .LIB, щелкнув правой кнопкой мыши проект в обозревателе решений, выбрав «Добавить ➔ существующий элемент» и перейдя к файлу .LIB.
Исправление: вместо этого перейдите в «Свойства проекта». Включите разные .LIB в каждую отладку и выпуск, добавив их в список. Перейдите в Linker ➔ Input и добавьте версию .LIB, подходящую для конфигурации.
У меня также была эта проблема, и она возникла потому, что я заново создал проект, а затем забыл повторно связать его по ссылке в зависимом проекте.
Таким образом, это была ссылка со ссылкой на старый проект вместо нового.
Важно знать, что существует ошибка при повторном добавлении ранее связанного проекта по ссылке. Вы должны вручную удалить ссылку в vcxproj, и только после этого вы сможете добавить ее заново. Это известная проблема в Visual studio, согласно msdn.
В моем случае определение макроса NDEBUG в "Определениях препроцессора" нужно было изменить на _DEBUG. Я строю статическую библиотеку для использования в.exe, который жаловался на ту же ошибку, перечисленную в вопросе. Перейдите в Свойства конфигурации (меню "Проект", пункт меню "Свойства"), а затем щелкните раздел C/C++, затем раздел препроцессора и измените определения препроцессора так, чтобы NDEBUG был изменен на _DEBUG (чтобы соответствовать установка в exe).
Как и все остальные ответы, я проверил свой Configuration Properties -> C/C++ -> Preprocessor
директивы.
В моем случае я имел NDEBUG
правильно определено в Release, но у меня также было: _SECURE_SCL=1
,
Удаление этого исправило проблему.
У меня была похожая проблема, но неправильная настройка была во внешнем.lib-файле, из которого у меня не было источников. Если у вас нет исходных файлов, самый простой обходной путь - просто изменить содержимое файла.lib.
Откройте файл.lib в редакторе (я использовал PSPad, также можно использовать блокнот Windows) и замените все вхождения _ITERATOR_DEBUG_LEVEL=2 на _ITERATOR_DEBUG_LEVEL=0