ошибка LNK2038: обнаружено несоответствие для '_ITERATOR_DEBUG_LEVEL': значение '0' не соответствует значению '2' в main.obj

131

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

Qbunia
источник

Ответы:

148

В 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 при отладке или наоборот!

AJG85
источник
6
Я не вижу ни в одном файле .h или .cpp ни одного из _ITERATOR_DEBUG_LEVEL или _SECURE_SCL. Они существуют только в файлах obj как: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" А как насчет
Qbunia
А как насчет пропуска точек останова отладчиком в выпуске? Некоторые точки останова не заполнены и говорится, что отладчик избегает их из-за оптимизации или связывания чего-то вроде этого
Qbunia
42
«Короче говоря, вы, вероятно, смешиваете релизную и отлаживающую dll», - мне помогло. Спасибо!
Макс
2
Waiwaiwait! Вы хотите сказать мне, что когда я использую MSVC, чтобы получить сборку отладки, я должен перекомпилировать ВСЕ зависимости? Даже тех, кого я не хочу отлаживать? Что за дерьмо, мужик! Я не могу в это поверить!
Michael
1
«Короче говоря, вы, вероятно, смешиваете библиотеки DLL выпуска и отладки» -> В моем случае библиотека RuntimeLibrary была MultiThreadedDebugDLL в сборке Release, тогда как она должна была быть MultiThreadedDLL.
Captain Normal
108

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

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

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

  • В дереве выберите Configuration Properties / C C ++ / Code Generation.
  • а для параметра « Библиотека времени выполнения» установлено одинаковое значение для всех проектов и приложений с зависимостями.
Фрэнсис Пьеро
источник
21

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

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

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

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

Антонио Майорано
источник
11

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

Stoney
источник
2
Оказывается, в проекте, который я пытался создать, была эта проблема, а также неожиданно отсутствовал препроцессор при отладке: _DEBUG. См. Forum.codeguru.com/…
JGeerWM
У меня была аналогичная проблема с mexing в Matlab, но наоборот: мне нужно было изменить сборку VS2013 на многобайтовую, чтобы получить соглашение. Это также устранило несоответствие для RuntimeLIbrary.
barnhillec
10

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

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

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

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

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

ArtHare
источник
Была аналогичная проблема, когда моя статическая библиотека приземлилась в одном и том же месте независимо от выпуска или отладки. В этом случае их следует назвать по-другому, добавив «d» или что-то подобное. В противном случае вам также придется перестраивать библиотеку каждый раз, когда вы переключаетесь между отладкой / выпуском.
yau
4

У меня была такая же проблема между библиотеками отладки и выпуска. Ошибка была в свойствах решения / свойствах конфигураций / конфигурациях.

Конфигурации проекта не соответствуют основной конфигурации / платформе.

Alstrice
источник
3

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

AlexT
источник
3

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

Андрей
источник
Я перепробовал практически все на этой странице, и это единственное, что сработало. Добавить _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHпод C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

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

Винит М
источник
2

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

Phm Mạnh
источник
2

В моем случае и для отладки, и для выпуска решением было очистить, а затем перестроить все решение.

Изменить: верно и в моем случае (VS2017), шаг 1: очистить проект. Шаг 2: изменить режим конфигурации (от отладки к выпуску или наоборот). Шаг 3: очистите проект. Шаг 4: установите требуемый режим конфигурации.

PS: чтобы изменить режим конфигурации, найдите настройки конфигурации в меню сборки

Ионут В.
источник
1

Сегодня у меня была такая же проблема (VS2010), я построил Release | Win32, затем попытался построить Debug | Win32, и получил это сообщение.

Я пробовал очистить Debug | Win32, но ошибка не исчезла. Затем я почистил Release | Win32, потом почистил Debug | Win32, а потом все построилось нормально.

GilesDMiddleton
источник
1

Мне удалось избавиться от этой ошибки (в моем случае с помощью Ogre3D + Bullet), изменив библиотеки зависимостей на отладочные версии в Project Properties -> Linker -> Input -> Additional Dependencies (VC10).

Я изменил BulletCollision.lib на BulletCollision_debug.lib (для настройки отладки), и он скомпилирован.

JTatie
источник
1

Я решил свою проблему с исправлением «Каталога дополнительных библиотек», в нем неправильно указывалось «$ (SolutionDir) \ Release», я изменил его в «$ (SolutionDir) \ $ (IntDir)»

Чтобы исправить это, откройте свойства проекта -> Свойства конфигурации -> Компоновщик -> Общие -> Каталог дополнительных библиотек.

Надеюсь, это поможет некоторым людям с той же проблемой;)

ThierryV
источник
поэтому для меня Debug работает нормально, но при сборке в выпуске я получаю указанную выше ошибку .... Я открыл каталог дополнительных библиотек, который я нашел: C: / Program Files / PCL 1.8.1 / lib / $ (Configuration) что мне теперь добавить Вот?
sqp_125 02
0

У меня также была эта проблема, и она возникла из-за того, что я переделал проект, а затем забыл повторно связать его по ссылке в зависимом проекте.

Таким образом, ссылка была сделана на старый проект вместо нового.

Важно знать, что при повторном добавлении ранее связанного проекта по ссылке возникает ошибка. Вам нужно вручную удалить ссылку в vcxproj, и только после этого вы сможете повторно добавить ее. Согласно msdn, это известная проблема в Visual Studio.

AtomicBoolean
источник
0

У меня была аналогичная проблема, но неправильная настройка была в файле extern .lib, из которого у меня не было источников. Если у вас нет исходных файлов , самый простой способ решения проблемы - просто изменить содержимое файла .lib.

Откройте файл .lib в редакторе (я использовал PSPad, также можно использовать блокнот для Windows) и замените все вхождения _ITERATOR_DEBUG_LEVEL = 2 на _ITERATOR_DEBUG_LEVEL = 0

napets
источник
0

В моем случае определение макроса NDEBUG в «Определениях препроцессора» нужно было изменить на _DEBUG. Я создаю статическую библиотеку для использования в .exe, которая жаловалась на ту же ошибку, указанную в вопросе. Перейдите в Свойства конфигурации (меню «Проект», пункт меню «Свойства»), затем щелкните раздел C / C ++, затем раздел препроцессора под ним, а затем отредактируйте определения препроцессора так, чтобы NDEBUG был изменен на _DEBUG (чтобы соответствовать установка в exe).

Alyoshak
источник
0

Как и все другие ответы, я проверил свои Configuration Properties -> C/C++ -> Preprocessorдирективы.
В моем случае я имел NDEBUGправильно определен в версии, но я также имел: _SECURE_SCL=1.

Удаление этого устранило проблему.

самоуверенный
источник
-1

Небольшое дополнение к приведенной выше справке: я получил ошибку несоответствия после добавления статической библиотеки в более старое решение 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
FunctionPoint
источник