c++ - Fehler LNK2038:Diskrepanz für '_ITERATOR_DEBUG_LEVEL' erkannt:Wert '0' stimmt nicht mit Wert '2' in main.obj überein




debugging linker (17)

Wenn Sie Ihr Projekt A in Release absichtlich mit einem anderen Projekt B in Debug verbinden möchten, um beispielsweise die Gesamtleistung Ihrer Anwendung während des Debuggens beizubehalten, wird dieser Fehler wahrscheinlich auftreten. Sie können dies beheben, indem Sie vorübergehend die Präprozessor-Flags von Projekt B so ändern, dass das Iterator-Debugging deaktiviert wird (und es mit Projekt A übereinstimmt):

Fügen Sie in den "Debug" -Eigenschaften von Projekt B, Konfigurationseigenschaften -> C / C ++ -> Präprozessor, den Präprozessordefinitionen Folgendes hinzu:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Erstellen Sie Projekt B in Debug, dann erstellen Sie Projekt A in Release und es sollte ordnungsgemäß verknüpfen.

Ich habe viele Lösungen für mein Problem gelesen, aber keine geholfen. Ich habe versucht, sauber, umbauen. Visual 2010 neu installiert und von Professional auf Ultimate umgestellt. Aber ich weiß immer noch nicht, warum ich diesen Fehler habe. Mein Projekt sieht folgendermaßen aus: 1 Exe-Lösung zum Testen meiner statischen Bibliothek. 1 Dll Solution statische Bibliothek. Code, der in dll konvertiert wird, verwendet die Funktion von 1 lib namens ClassificationFramework. Ich habe diese lib als Header und cpp im Grunde Quellcode zur Verfügung gestellt. In Exe-Lösung habe ich meine generierte Bibliothek + einige andere Bibliotheken verlinkt, um sie + ClassificationFramework.dll auszuführen. Alles funktioniert gut, wenn ich Release benutze, aber wenn ich zu Debug wechseln (weil ich einige Sachen debuggen will, bin ich es leid, den Debugger im Release-Modus zu überspringen).

    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

Wenn ich in Release einbaut habe ich auch diese Warnungen:

    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

Ich habe festgestellt, dass Debugger wegen falscher Pfad zu PDB-Dateien überspringt.

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

Wenn ich auf Debug-> Windows-> Module gehe, sehe ich, dass er diese pdb-Dateien oder etwas nicht finden kann. Wie kann ich ihm sagen, dass diese Dateien hier und hier sind? Ich habe versucht, MSvisual als Administrator auszuführen, aber das hat auch nicht geholfen. Ich benutzte Microsoft-Server, um pdb Dateien zu laden, aber half auch nicht.


Letzte Chance (wenn andere Methoden nicht funktionieren): Definieren Sie das Makro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH in allen Projekten. Es wird "#pragma detect_mismatch" -Funktion deaktivieren, die in CRT-Headern verwendet wird.


In meinem Fall musste die NDEBUG-Makrodefinition in den "Preprocessor-Definitionen" zu _DEBUG geändert werden. Ich baue eine statische Bibliothek für die Verwendung in einer EXE-Datei, die sich über denselben Fehler beschwert, der in der Frage aufgeführt ist. Gehen Sie zu Konfigurationseigenschaften (Menü "Projekt", Menüeintrag "Eigenschaften") und klicken Sie dann auf den Abschnitt C / C ++, dann auf den Präprozessorbereich und bearbeiten Sie dann Ihre Präprozessordefinitionen, so dass NDEBUG in _DEBUG geändert wird Einstellung in der exe).


Ich mache ein kleines Update zu diesem Thema, da ich gerade denselben Fehler bei einer Anwendung hatte, die mit einer statischen Lib verlinkt, nachdem ich das alte Visual 6-Projekt nach Visual Studio 2012 migriert hatte.

In meinem Fall war der Fehler, dass ich fälschlicherweise die Release-Version der statischen Lib mit / MDd anstelle von / MD kompiliert habe, während die Anwendung / MD in Release ist. Durch das Festlegen der richtigen / MD im statischen Lib-Projekt wurde das Problem behoben.

Dies geschieht in den Projekteigenschaften

  • Wählen Sie Konfigurationseigenschaften / C C ++ / Codegenerierung in der Baumstruktur
  • und die Option Laufzeitbibliothek in all Ihren abhängigen Projekten und Anwendungen auf denselben Wert gesetzt.

Ich hatte dieses Problem auch.

Mein Problem war, dass ich die Bibliothek Include-Verzeichnisse aus meinen Debug-Konfigurationen kopiert / eingefügt habe.

Das Projekt "Indep" hat die statische Bibliothek "Dep.lib" von "../Debug" eingeschlossen, sogar in der Version. Die Lösung bestand darin, das Bibliotheksverzeichnis in "../Release" zu ändern, sodass ich die Release-Build-Bibliothek und nicht die zuvor erstellte Debug-Bibliothek fing.


In meinem Fall bestand die Lösung für Debug und Release darin, die gesamte Lösung zu bereinigen und anschließend neu zu erstellen.


Ich hatte ein Missverhältnis zwischen Projekten: eins mit Multi-Byte-Zeichensatz, das andere mit Unicode. Wenn Sie diese korrigieren, um Unicode zu vereinbaren, wurde das Problem behoben.


Ich habe meine Probleme beim Korrigieren des "Zusätzlichen Bibliotheksverzeichnisses" behoben, dieses war falsch bei der Angabe von "$ (SolutionDir) \ Release", ich habe es in "$ (SolutionDir) \ $ (IntDir)" geändert)

Um es zu korrigieren, öffnen Sie Ihre Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Allgemein -> Zusätzliches Bibliotheksverzeichnis

Ich hoffe, dass dies einigen Leuten mit den gleichen Problemen helfen wird;)


Wie alle anderen Antworten habe ich meine Configuration Properties -> C/C++ -> Preprocessor überprüft.
In meinem Fall hatte ich das NDEBUG in Release korrekt definiert, aber ich hatte auch: _SECURE_SCL=1 .

Durch das Entfernen dieses Problems wurde das Problem behoben.


opencv_core245.lib (dxt.obj): Fehler LNK2038: Mismatch für '_ITERATOR_DEBUG_LEVEL' erkannt: Wert '0' stimmt nicht mit Wert '2' in test.obj überein Ich habe einen Fehler wie diesen bekommen.
Ich habe opencv_core245.lib und opencv_core245d.lib in Linker-> Input-> Zusätzliche Abhängigkeiten. Da diese zwei confloticing waren, entfernte ich zuerst eine opencv_core245.lib. Fehler ist weg.


Der Fehler kann durch Mischen von Debug-Builds und Build-Releases in derselben ausführbaren Datei oder DLL verursacht werden.

  1. Sind im vs-Konfigurationsmanager einige Ihrer Projekte im Debug-Modus und einige im Release-Modus?
  2. Ist eines Ihrer Release-Projekte mit dem Präprozessorsymbol DEBUG oder _DEBUG definiert?
  3. Ist bei einem Ihrer Debug-Projekte das Präprozessorsymbol NDEBUG definiert?

Ich hatte ähnliches Problem, aber die falsche Einstellung war in der externen .lib-Datei, aus der ich keine Quellen hatte. Wenn Sie die Quelldateien nicht haben , besteht die einfachste Problemumgehung darin, nur den Inhalt der LIB-Datei zu ändern.

Öffne die .lib Datei in einem Editor (ich habe PSPad verwendet, Knospe Windows Notepad ist auch möglich) und ersetze alle Vorkommen von _ITERATOR_DEBUG_LEVEL = 2 zu _ITERATOR_DEBUG_LEVEL = 0


Ich hatte auch dieses Problem und es entstand, weil ich das Projekt neu erstellte und dann vergaß, es durch Verweis in einem abhängigen Projekt neu zu verknüpfen.

So wurde anstelle des Neuen auf das alte Projekt Bezug genommen.

Es ist wichtig zu wissen, dass es einen Fehler beim erneuten Hinzufügen eines zuvor verknüpften Projekts durch Verweis gibt. Sie müssen den Verweis manuell in vcxproj löschen und nur dann können Sie ihn erneut hinzufügen. Dies ist ein bekanntes Problem in Visual Studio nach msdn.


Versuchen Sie, die Makrodefinition _DEBUG in NDEBUG in C ++ - Projekteigenschaften zu ändern (für die Release-Konfiguration) Konfigurationseigenschaften -> C / C ++ -> Präprozessor -> Präprozessordefinitionen


Ich habe es geschafft, diesen Fehler loszuwerden (in meinem Fall mit Ogre3D + Bullet), indem ich die Abhängigkeitsbibliotheken zu den Debug-Versionen in Projekteigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten (VC10) änderte.

Ich habe BulletCollision.lib in BulletCollision_debug.lib geändert (für die Debug-Konfiguration) und es kompiliert.


Ich hatte heute das selbe Problem (VS2010), ich habe Release erstellt Win32, dann versucht, Debug | zu bauen Win32, und habe diese Nachricht erhalten.

Ich habe versucht, Debug | Win32, aber der Fehler ist weiterhin vorhanden. Ich habe dann Release | gereinigt Win32, dann bereinigt Debug | Win32, und dann hat es gut gebaut.


Verwenden Sie einfach einen rohen Zeiger für Ihren Funktionsparameter anstelle von shared_ptr. Der Zweck eines Smart-Zeigers ist es, die Lebensdauer des Objekts zu steuern, aber die Lebensdauer des Objekts ist bereits durch die C ++ - Scoping-Regeln garantiert: Sie existiert mindestens so lange wie das Ende Ihrer Funktion. Das heißt, der aufrufende Code kann das Objekt möglicherweise nicht löschen, bevor Ihre Funktion zurückkehrt. somit ist die Sicherheit eines "dummen" Zeigers gewährleistet, solange Sie nicht versuchen, das Objekt in Ihrer Funktion zu löschen.

Sie müssen ein shared_ptr nur dann an eine Funktion übergeben, wenn Sie das Objekt an die Funktion übergeben möchten oder die Funktion eine Kopie des Zeigers erstellen soll.





c++ debugging linker