błąd LNK2038: wykryto niezgodność dla „_ITERATOR_DEBUG_LEVEL”: wartość „0” nie odpowiada wartości „2” w pliku main.obj

135

Przeczytałem wiele rozwiązań mojego problemu, ale żadne nie pomogło. Próbowałem wyczyścić, odbudować. Ponownie zainstalowałem Visual 2010 i zmień z Professional na Ultimate. Ale nadal nie wiem, dlaczego mam ten błąd. Mój projekt wygląda tak: 1 Rozwiązanie Exe do testowania mojej biblioteki statycznej. 1 Biblioteka statyczna Dll Solution. Kod konwertowany do dll wykorzystuje funkcję z 1 biblioteki o nazwie ClassificationFramework. Dostarczyłem tę bibliotekę jako nagłówki i cpp, więc w zasadzie kod źródłowy. W rozwiązaniu Exe połączyłem moją wygenerowaną bibliotekę + kilka innych bibliotek, aby ją uruchomić + ClassificationFramework.dll. Wszystko działa dobrze, gdy używam wydania, ale kiedy zmieniam na debugowanie (ponieważ chcę debugować niektóre rzeczy, jestem zmęczony pomijaniem debugera w trybie wydania). Otrzymuję to:

    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

Kiedy kompiluję w wersji Release, otrzymałem również następujące ostrzeżenia:

    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

Zauważyłem, że Debugger pomija z powodu złej ścieżki do plików 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).

Kiedy idę do Debug-> Windows-> Modules, widzę, że nie może znaleźć tych plików pdb lub czegoś takiego. Jak mogę mu powiedzieć, że te pliki są tutaj i tutaj? Próbowałem uruchomić MSvisual jako administrator, ale to też nie pomogło. Użyłem serwera Microsoft do załadowania plików pdb, ale też nie pomogło.

Qbunia
źródło

Odpowiedzi:

153

W VS2010 poziom debugowania iteratora domyślnie wynosi 2 w debugowaniu i jest wyłączony w wersji. Jedna z bibliotek DLL, z których korzystasz, prawdopodobnie ma wyłączone debugowanie iteratora w debugowaniu, ponieważ została zbudowana w starszej wersji programu Visual Studio lub jawnie dodała definicje do projektu.

Wyszukaj _ITERATOR_DEBUG_LEVELi _SECURE_SCLusuń je lub ustaw odpowiednio we wszystkich projektach i źródłach i odbuduj wszystko.

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

Krótko mówiąc, prawdopodobnie mieszasz biblioteki DLL wydania i debugowania. Nie łącz bibliotek dll wydania podczas debugowania i na odwrót!

AJG85
źródło
6
Nie widzę w żadnym pliku .h ani .cpp żadnego z _ITERATOR_DEBUG_LEVEL lub _SECURE_SCL. Istnieją tylko w plikach obj jako: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" A co z
Qbunia
A co z pomijaniem punktów przerwania przez debuger w wersji? Niektóre punkty przerwania nie są wypełnione i mówi debugerowi, aby ich unikać z powodu optymalizacji lub łączenia czegoś takiego
Qbunia
43
„Krótko mówiąc, prawdopodobnie miksujesz pliki DLL do wydania i debugowania”. Dzięki!
Max
2
Waiwaiwait! Chcesz mi powiedzieć, że kiedy używam MSVC, aby uzyskać kompilację debugowania, muszę ponownie skompilować WSZYSTKIE zależności? Nawet te, których nie chcę debugować? Co za gówno! Nie mogę w to uwierzyć!
Michael,
1
„Krótko mówiąc, prawdopodobnie mieszasz biblioteki DLL wydania i debugowania” -> W moim przypadku RuntimeLibrary była MultiThreadedDebugDLL w kompilacji wydania, podczas gdy powinna być MultiThreadedDLL.
Captain Normal
108

Robię małą aktualizację tego problemu, ponieważ właśnie dzisiaj miałem ten sam błąd w aplikacji, która łączy się z biblioteką statyczną, po migracji starego projektu Visual 6 do Visual Studio 2012.

W moim przypadku błąd polegał na tym, że omyłkowo skompilowałem wydanie statycznej wersji biblioteki z / MDd zamiast / MD , podczas gdy aplikacja jest w wersji / MD . Ustawienie prawidłowego / MD w projekcie biblioteki statycznej rozwiązało problem.

Odbywa się to we właściwościach projektu

  • Wybierz w drzewie Właściwości konfiguracji / C C ++ / Generowanie kodu
  • i opcja Runtime Library ustawiona na to samo we wszystkich projektach i aplikacji zależności.
Francis Pierot
źródło
23

Jeśli chcesz celowo połączyć swój projekt A w wersji z innym projektem B w debugowaniu, powiedzmy, aby zachować ogólne korzyści wydajnościowe aplikacji podczas debugowania, prawdopodobnie napotkasz ten błąd. Możesz to naprawić, tymczasowo modyfikując flagi preprocesora projektu B, aby wyłączyć debugowanie iteratora (i dopasować je do projektu A):

We właściwościach „Debug” projektu B, Configuration Properties -> C / C ++ -> Preprocessor, dodaj następujące elementy do Preprocessor Definitions:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Odbuduj projekt B w debugowaniu, a następnie skompiluj projekt A w wersji i powinien poprawnie połączyć się.

Antonio Maiorano
źródło
11

Miałem niedopasowanie między projektami: jeden z zestawem znaków wielobajtowych, drugi z Unicode. Poprawienie ich w celu uzgodnienia Unicode rozwiązało problem.

kamienny
źródło
2
Okazuje się, że projekt, który próbowałem zbudować, miał ten problem, a także nieoczekiwany brakujący preprocesor w debugowaniu: _DEBUG. Zobacz forums.codeguru.com/…
JGeerWM
Miałem podobny problem z meksykowaniem w Matlabie, ale na odwrót: musiałem zmienić kompilację VS2013 na wielobajtową, aby uzyskać zgodę. To również rozwiązało problem niedopasowania biblioteki RuntimeLI.
barnhillec
10

Błąd może być spowodowany mieszaniem razem kompilacji debugowania i kompilacji wydania w tym samym pliku wykonywalnym lub bibliotece dll.

  1. w menedżerze konfiguracji vs, czy niektóre projekty są w trybie debugowania, a inne w trybie wydania?
  2. czy któryś z projektów wydania ma zdefiniowany symbol preprocesora DEBUG lub _DEBUG?
  3. czy jeden z projektów debugowania ma zdefiniowany symbol preprocesora NDEBUG?
Aviad Rozenhek
źródło
7

Ja też miałem ten problem.

Mój problem polegał na tym, że skopiowałem / wkleiłem bibliotekę zawierającą katalogi z moich konfiguracji debugowania.

Tak więc projekt „Indep” zawierał statyczną bibliotekę „Dep.lib” z „../Debug”, nawet w wydaniu. Poprawka polegała na zmianie katalogu biblioteki na „../Release”, więc złapałem bibliotekę zbudowaną w wersji Release, a nie wcześniej zbudowaną bibliotekę debugowania.

ArtHare
źródło
Miałem podobny problem, w którym moja statyczna biblioteka wylądowała w tym samym miejscu, niezależnie od wydania lub debugowania. W takim przypadku należy je nazwać inaczej, dodając „d” lub takie. W przeciwnym razie będziesz zmuszony odbudować bibliotekę za każdym razem, gdy przełączasz się między debugowaniem a wydaniem.
yau
4

Miałem ten sam problem między bibliotekami debugowania i wydania. Błąd tkwił we właściwościach rozwiązania / właściwościach konfiguracji / konfiguracjach.

Konfiguracje projektów nie pasowały do ​​głównej konfiguracji / platformy.

Alstrice
źródło
3

Spróbuj zmienić definicję makra _DEBUG na NDEBUG we właściwościach projektu C ++ (dla konfiguracji wydania) Właściwości konfiguracji -> C / C ++ -> Preprocessor -> Definicje preprocesora

AlexT
źródło
3

Ostatnia szansa (jeśli inne sposoby nie działają): zdefiniuj makro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH we wszystkich projektach. Wyłączy to funkcję „#pragma detection_mismatch”, która jest używana w nagłówkach CRT.

Andrey
źródło
Próbowałem prawie wszystkiego na tej stronie i to była jedyna rzecz, która działała. Dodaj _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHpod C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

opencv_core245.lib (dxt.obj): błąd LNK2038: wykryto niezgodność dla „_ITERATOR_DEBUG_LEVEL”: wartość „0” nie pasuje do wartości „2” w test.obj. Otrzymałem taki błąd.
Mam opencv_core245.lib i opencv_core245d.lib w Linker-> Input-> Additional dependenc. Ponieważ te dwa były kłopotliwe, usunąłem pierwszy plik opencv_core245.lib. Błąd zniknął.

Vinit M
źródło
2

Spróbuj tego: Idź do właściwości projektu -> C / C ++ -> Generowanie kodu -> Biblioteka wykonawcza Wybierz z wartości combobox: Wielowątkowa biblioteka DLL (/ MD) To działa dla mnie :)

Phạm Mạnh
źródło
2

W moim przypadku, zarówno w przypadku debugowania, jak i wydania, rozwiązaniem było wyczyszczenie, a następnie przebudowanie całego rozwiązania.

Edycja: prawda w moim przypadku również (VS2017) krok 1: wyczyść projekt. step2: zmiana trybu konfiguracji (z debugowania na wydanie lub odwrotnie). krok 3: wyczyść projekt. step4: zbuduj w wymaganym trybie konfiguracji.

PS: aby zmienić tryb konfiguracji, znajdź ustawienia konfiguracji w menu budowania

Ionut V.
źródło
1

Miałem dziś ten sam problem (VS2010), zbudowałem wydanie | Win32, a następnie próbował skompilować debugowanie | Win32 i otrzymałem tę wiadomość.

Próbowałem wyczyścić debugowanie | Win32, ale błąd nadal występował. Następnie wyczyściłem Release | Win32, a następnie wyczyszczono debugowanie | Win32, a potem dobrze się zbudował.

GilesDMiddleton
źródło
1

Udało mi się pozbyć tego błędu (w moim przypadku używając Ogre3D + Bullet) zmieniając biblioteki zależności na wersje debugowania w Project Properties -> Linker -> Input -> Additional Dependencies (VC10).

Zmieniłem BulletCollision.lib na BulletCollision_debug.lib (do konfiguracji debugowania) i skompilowałem.

JTatie
źródło
1

Rozwiązałem problem z poprawieniem „Dodatkowego katalogu biblioteki”, ten błąd wskazywał „$ (SolutionDir) \ Release”, zmieniłem go w „$ (SolutionDir) \ $ (IntDir)”

Aby to poprawić, otwórz właściwości projektu -> Właściwości konfiguracji -> Konsolidator -> Ogólne -> Dodatkowy katalog biblioteki

Mam nadzieję, że pomoże to niektórym ludziom z tymi samymi problemami;)

ThierryV
źródło
więc dla mnie Debugowanie działa dobrze, ale podczas budowania w wersji pojawia się powyższy błąd .... Otworzyłem dodatkowy katalog biblioteki. Znalazłem: C: / Program Files / PCL 1.8.1 / lib / $ (Konfiguracja) co mam teraz dodać tutaj?
sqp_125
0

Miałem też ten problem i powstał, ponieważ ponownie wykonałem projekt, a następnie zapomniałem ponownie połączyć go przez odniesienie w projekcie zależnym.

W ten sposób łączył się przez odniesienie do starego projektu zamiast nowego.

Ważne jest, aby wiedzieć, że istnieje błąd w ponownym dodawaniu wcześniej połączonego projektu przez odniesienie. Musisz ręcznie usunąć odniesienie w vcxproj i dopiero wtedy możesz je ponownie dodać. Jest to znany problem w programie Visual Studio według msdn.

AtomicBoolean
źródło
0

Miałem podobny problem, ale złe ustawienie było w zewnętrznym pliku .lib, z którego nie miałem źródeł. Jeśli nie masz plików źródłowych , najprostszym obejściem jest zmiana zawartości pliku .lib.

Otwórz plik .lib w edytorze (użyłem PSPada, można też użyć notatnika bud Windows) i zamień wszystkie wystąpienia _ITERATOR_DEBUG_LEVEL = 2 na _ITERATOR_DEBUG_LEVEL = 0

serwetki
źródło
0

W moim przypadku definicja makra NDEBUG w „Definicjach preprocesora” musiała zostać zmieniona na _DEBUG. Buduję bibliotekę statyczną do użytku w pliku .exe, która skarżyła się na ten sam błąd wymieniony w pytaniu. Przejdź do Właściwości konfiguracji (menu „Projekt”, pozycja menu „Właściwości”), a następnie kliknij sekcję C / C ++, a następnie sekcję Preprocessor pod nią, a następnie edytuj definicje preprocesora, tak aby NDEBUG został zmieniony na _DEBUG (aby dopasować ustawienie w exe).

Alyoshak
źródło
0

Jak wszystkie inne odpowiedzi, sprawdziłem swoje Configuration Properties -> C/C++ -> Preprocessordyrektywy.
W moim przypadku miałem NDEBUGpoprawnie zdefiniowane w wydaniu, ale także miał: _SECURE_SCL=1.

Usunięcie tego rozwiązało problem.

Coxy
źródło
-1

Mały dodatek do powyższej pomocy: otrzymałem błąd niezgodności po dodaniu statycznego libto do starszego rozwiązania VST używającego VST 2017. VST generuje teraz „stdfax.h” dla prekompilowanych nagłówków zawierających te 2 wiersze:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
FunctionPoint
źródło