помилка LNK2038: виявлено невідповідність для '_ITERATOR_DEBUG_LEVEL': значення '0' не відповідає значенню '2' у main.obj


131

Я прочитав багато рішень своєї проблеми, але жоден не допоміг. Я спробував очистити, відновити. Перевстановлена ​​візуальна 2010 та перехід від професійної до кінцевої. Але все одно я не знаю, чому у мене така помилка. Мій проект виглядає так: 1 Рішення Exe для тестування моєї статичної бібліотеки. 1 статична бібліотека Dll Solution. Код, який перетворюється на dll, використовує функцію з 1 lib під назвою ClassificationFramework. Я надав цю вкладку як заголовки та cpp, так в основному вихідний код. У рішенні Exe я зв'язав свою створену бібліотеку + деякі інші бібліотеки для її запуску + ClassificationFramework.dll. Все працює добре, коли я використовую Release, але коли я переходжу на налагодження (оскільки я хочу налагодити деякі речі, мені набрид пропускати налагоджувач у режимі випуску), я отримую це:

    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).

Коли я переходжу до Налагодження-> Windows-> Модулі, я бачу, що він не може знайти ці файли pdb чи щось таке. Як я можу сказати йому, що ці файли тут і тут? Я намагався запустити MSvisual як адміністратор, але це теж не допомогло. Я використовував сервер Microsoft для завантаження файлів pdb, але також не допомагав.

Відповіді:


148

У VS2010 ітератор налагоджує рівень налагодження до 2 у налагодженні та відключений у випуску. Один з dll, який ви використовуєте, ймовірно, що налагодження ітератора вимкнено в налагодженні або тому, що він був побудований у більш старій версії візуальної студії, або вони явно додали визначення до проекту.

Шукайте _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)

Коротше кажучи, ви, ймовірно, змішуєте випуск та налагодження dlls. Не зв'язуйте dll-релізи у налагодженні чи навпаки!


6
Я не бачу в будь-якому .h або CPP - файл будь-якого з _ITERATOR_DEBUG_LEVEL або _SECURE_SCL Вони існують тільки в OBJ - файлів , як: / FAILIFMISMATCH: «_ ITERATOR_DEBUG_LEVEL = 0» Що про
Qbunia

А як щодо пропускання точок прориву налагоджувачем у випуску? Деякі точки перерви не заповнені, і каже, що налагоджувач уникає їх через оптимізацію чи зв’язування чогось подібного
Qbunia

42
"Коротше кажучи, ви, мабуть, змішуєте випуски та налагодження", що допомогли мені. Дякую!
Макс

2
Waiwaiwait! Ви хочете сказати мені, що коли я використовую MSVC, щоб отримати збірку налагоджень, я повинен перекомпілювати ВСІ залежності? Навіть тих, кого мені не хочеться налагоджувати? Який лайно чоловік! Я не можу повірити в це!
Майкл

1
"Коротше кажучи, ви, мабуть, змішуєте випуски та налагодження dll" -> У моєму випадку RuntimeLibrary була MultiThreadedDebugDLL у складанні Release, коли вона мала бути MultiThreadedDLL.
Капітан Нормальний

108

Я трохи вдосконалюю це питання, оскільки у мене сьогодні була така сама помилка у програмі, яка пов'язує статичну лібку, після того як я перемістив старий проект Visual 6 на Visual Studio 2012.

У моєму випадку помилка полягала в тому, що я помилково склав версію Release статичної lib з / MDd замість / MD , тоді як програма є / MD у випуску. Встановлення правильного / MD у статичному проекті lib вирішило проблему.

Це робиться у властивостях Project

  • Виберіть у дереві властивості конфігурації / C C ++ / генерація коду
  • і параметр « Бібліотека виконання» встановлено однаково для всіх проектів та застосувань ваших залежностей.

21

Якщо ви хочете цілеспрямовано зв’язати ваш проект A у випуску з іншим проектом B у налагодженні, скажіть, щоб зберегти загальні переваги продуктивності вашої програми під час налагодження, тоді ви, ймовірно, потрапите в цю помилку. Ви можете виправити це, тимчасово змінивши прапори препроцесора проекту B, щоб відключити налагодження ітератора (і зрівняти його з проектом A):

У властивостях "Налагодження" Проекту B, Властивості конфігурації -> C / C ++ -> Препроцесор, додайте до визначень препроцесора наступне:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

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


11

У мене була невідповідність між проектами: один з багатобайтовим набором символів, другий з Unicode. Виправивши їх, щоб узгодити Unicode, виправили проблему.


2
Виявляється, проект, який я намагався створити, мав цю проблему, а також несподіваний відсутній препроцесор у налагодженні: _DEBUG. Дивіться forums.codeguru.com/…
JGeerWM

У Matlab у мене була аналогічна проблема, але навпаки: мені потрібно було змінити збірку VS2013 на багатобайтову, щоб отримати угоду. Це також вирішило невідповідність RuntimeLIbrary.
barnhillec

10

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

  1. у менеджері конфігурації vs деякі ваші проекти у режимі налагодження, а інші у режимі випуску?
  2. чи є одним із проектів випуску визначений символ препроцесора DEBUG або _DEBUG?
  3. чи є одним із ваших проектів налагодження визначений символ препроцесора NDEBUG?

7

У мене була і ця проблема.

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

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


У мене була схожа проблема, коли мій статичний ліб приземлився там же, незалежно від того, відпустити чи налагодити. У такому випадку слід назвати їх по-різному, додавши "d" або подібне. В іншому випадку ви також будете змушені перебудовувати ліб при кожному переключенні між налагодженням / випуском.
Яу

4

У мене була однакова проблема між бібліотеками налагодження та випуску. Помилка була у властивості рішення / Властивості конфігурацій / Конфігурації.

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


3

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


3

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


Я спробував майже все на цій сторінці, і це було єдине, що спрацювало. Додати _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHпід C/C++ >> Preprocessor >> PreprocessorDefinitions.
Контанго

2

opencv_core245.lib (dxt.obj): помилка LNK2038: виявлено невідповідність для '_ITERATOR_DEBUG_LEVEL': значення '0' не відповідає значенню '2' у test.obj У мене є така помилка.
У мене є opencv_core245.lib та opencv_core245d.lib у Linker-> Input-> Additional odvisenc. Оскільки це двоє було конфліктним, я видалив спочатку один opencv_core245.lib. Помилка пішла.


2

Спробуйте це: Властивість проекту Goto -> C / C ++ -> Генерація коду -> Бібліотека часу виконання Виберіть із значення комбінованого файлу: Багатопотокова DLL (/ MD) Це працює для мене :)


2

У моєму випадку і для налагодження, і для випуску рішенням було очистити, а потім відновити весь розчин.

Редагувати: вірно і в моєму випадку (VS2017) крок 1: очистити проект. step2: змінити режим конфігурації (від налагодження до випуску чи навпаки). step3: очистити проект. крок 4: побудова в необхідному режимі конфігурації.

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


1

У мене була така ж проблема сьогодні (VS2010), я створив Release | Win32, потім спробував побудувати налагодження | Win32, і отримав це повідомлення.

Я спробував очистити налагодження | Win32, але помилка все ще зберігається. Потім я очистив випуск | Win32, потім очистили налагодження | Win32, а потім це добре.


1

Мені вдалося позбутися цієї помилки (у моєму випадку за допомогою Ogre3D + Bullet), змінивши бібліотеки залежностей на версії налагодження у Властивості проекту -> Linker -> Input -> Додаткові залежності (VC10).

Я змінив BulletCollision.lib на BulletCollision_debug.lib (для конфігурації налагодження), і він скомпілювався.


1

Я вирішив свою проблему з виправленням "Додаткової каталогі бібліотеки", ця помилка була вказана на "$ (SolutionDir) \ Release", я змінив її на "$ (SolutionDir) \ $ (IntDir)"

Щоб виправити це, відкрийте свої властивості проекту -> Властивості конфігурації -> Linker -> General -> Additional Directory Library

Я сподіваюся, що це допоможе деяким паполам з тією ж неприємністю;)


тож для мене налагодження працює чудово, але при складанні у версії я отримую вищезгадану помилку .... Я відкрив додатковий каталог бібліотеки, який я знайшов: C: / Program Files / PCL 1.8.1 / lib / $ (Конфігурація), що мені зараз додати тут?
sqp_125

0

У мене також було це питання, і воно виникло, тому що я знову створив проект, а потім забув повторно пов’язати його посиланням на залежний проект.

Таким чином, він посилався на посилання на старий проект замість нового.

Важливо знати, що є помилка в повторному додаванні раніше пов'язаного проекту за посиланням. Ви повинні видалити посилання в vcxproj вручну і лише після цього зможете його знову додати. Це відомий випуск у студії Visual згідно з повідомленням msdn.


0

У мене була подібна проблема, але неправильна настройка була у файлі exli .lib, з якого у мене не було джерел. Якщо у вас немає вихідних файлів , найпростіший спосіб вирішити - просто змінити вміст .lib-файлу.

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


0

У моєму випадку визначення макросу NDEBUG у "Визначеннях препроцесора" потрібно змінити на _DEBUG. Я будую статичну бібліотеку для використання в .exe, яка скаржилася на ту саму помилку, яку вказано в питанні. Перейдіть у розділ "Властивості конфігурації" (меню "Проект", пункт меню "Властивості"), а потім натисніть розділ C / C ++, потім розділ "Препроцесор", а потім відредагуйте свої визначення Preprocessor, щоб NDEBUG було змінено на _DEBUG (щоб відповідати встановлення в exe).


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.