Fehler LNK2038: Nichtübereinstimmung für '_ITERATOR_DEBUG_LEVEL' festgestellt: Wert '0' stimmt nicht mit Wert '2' in main.obj überein

131

Ich habe viele Lösungen für mein Problem gelesen, aber keine hat geholfen. Ich habe versucht, sauber zu machen, wieder aufzubauen. Visual 2010 neu installiert und von professionell zu ultimativ gewechselt. 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 Statische Bibliothek der DLL-Lösung. Code, der in DLL konvertiert wird, verwendet die Funktion 1 lib namens ClassificationFramework. Ich habe diese Bibliothek als Header und CPP bereitgestellt, also im Grunde genommen als Quellcode. In der Exe-Lösung habe ich meine generierte Bibliothek + einige andere Bibliotheken verknüpft, um sie auszuführen + ClassificationFramework.dll. Alles funktioniert gut, wenn ich Release verwende, aber wenn ich zu Debug wechsle (weil ich einige Dinge debuggen möchte, habe ich es satt, den Debugger im Release-Modus zu überspringen), bekomme ich Folgendes:

    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

Als ich Release einbaute, bekam ich auch folgende 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 der Debugger wegen eines falschen Pfads zu PDF-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 zu Debug-> Windows-> Module gehe, sehe ich, dass er diese PDF-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 auch das hat nicht geholfen. Ich habe Microsoft Server zum Laden von PDF-Dateien verwendet, aber auch nicht geholfen.

Qbunia
quelle

Antworten:

148

In VS2010 ist die Debugstufe des Iterators beim Debug standardmäßig auf 2 eingestellt und in der Version deaktiviert. In einer der von Ihnen verwendeten DLLs ist das Debuggen von Iteratoren beim Debuggen wahrscheinlich deaktiviert, entweder weil es in einer älteren Version von Visual Studio erstellt wurde oder weil die Definitionen explizit zum Projekt hinzugefügt wurden.

Suchen _ITERATOR_DEBUG_LEVELund _SECURE_SCLentfernen Sie sie oder stellen Sie sie in allen Projekten und Quellen entsprechend ein und erstellen Sie alles neu.

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

Kurz gesagt, Sie mischen wahrscheinlich Release- und Debug-DLLs. Verknüpfen Sie keine Release-DLLs im Debug oder umgekehrt!

AJG85
quelle
6
Ich sehe in keiner .h- oder .cpp-Datei eine von _ITERATOR_DEBUG_LEVEL oder _SECURE_SCL. Sie existieren nur in obj-Dateien als: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" Was ist mit
Qbunia
Was ist mit dem Überspringen von Haltepunkten durch den Debugger in der Version? Einige Haltepunkte sind nicht gefüllt und der Debugger vermeidet sie aufgrund von Optimierungen oder Verknüpfungen wie diesen
Qbunia
42
"Kurz gesagt, Sie mischen wahrscheinlich Release- und Debug-DLLs", half mir. Vielen Dank!
Max
2
Waiwaiwait! Sie wollen mir sagen, dass ich bei Verwendung von MSVC ALLE Abhängigkeiten neu kompilieren muss, um einen Debug-Build zu erhalten? Sogar die, die ich nicht debuggen möchte? Was zum Teufel! Ich kann das nicht glauben!
Michael
1
"Kurz gesagt, Sie mischen wahrscheinlich Release- und Debug-DLLs" -> In meinem Fall war die RuntimeLibrary im Release-Build MultiThreadedDebugDLL, wenn sie MultiThreadedDLL hätte sein sollen.
Captain Normal
108

Ich mache ein kleines Update zu diesem Problem, da ich heute den gleichen Fehler bei einer Anwendung hatte, die mit einer statischen Bibliothek verknüpft ist, nachdem ich das alte Visual 6-Projekt auf Visual Studio 2012 migriert habe.

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

Dies erfolgt in den Projekteigenschaften

  • Wählen Sie in der Baumstruktur Konfigurationseigenschaften / C C ++ / Codegenerierung aus
  • und die Option Laufzeitbibliothek , die für alle Ihre Abhängigkeitsprojekte und -anwendungen gleich ist.
Francis Pierot
quelle
21

Wenn Sie Ihr Projekt A in Release absichtlich mit einem anderen Projekt B in Debug verknüpfen möchten, beispielsweise um die allgemeinen Leistungsvorteile Ihrer Anwendung beim Debuggen beizubehalten, wird dieser Fehler wahrscheinlich auftreten. Sie können dies beheben, indem Sie die Präprozessor-Flags von Projekt B vorübergehend ändern, um das Iterator-Debugging zu deaktivieren (und es an Projekt A anzupassen):

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

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Erstellen Sie Projekt B in Debug neu, und erstellen Sie dann Projekt A in Release. Die Verknüpfung sollte korrekt sein.

Antonio Maiorano
quelle
11

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

stoney
quelle
2
Es stellt sich heraus, dass das Projekt, das ich erstellen wollte, dieses Problem sowie einen unerwartet fehlenden Präprozessor im Debug hatte: _DEBUG. Siehe forums.codeguru.com/…
JGeerWM
Ich hatte ein ähnliches Problem beim Mexing in Matlab, aber umgekehrt: Ich musste den VS2013-Build auf Multi-Byte ändern, um die Vereinbarung zu erhalten. Dies löste auch eine Nichtübereinstimmung für RuntimeLIbrary.
Barnhillec
10

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

  1. Befinden sich einige Ihrer Projekte im vs-Konfigurationsmanager im Debug-Modus und einige im Release-Modus?
  2. Ist in einem Ihrer Release-Projekte das Präprozessorsymbol DEBUG oder _DEBUG definiert?
  3. Ist in einem Ihrer Debug-Projekte das Präprozessorsymbol NDEBUG definiert?
Aviad Rozenhek
quelle
7

Ich hatte auch dieses Problem.

Mein Problem war, dass ich die Bibliotheksverzeichnisse aus meinen Debug-Konfigurationen kopiert / eingefügt hatte.

Das Projekt "Indep" enthielt also die statische Bibliothek "Dep.lib" von "../Debug", sogar in der Version. Das Update bestand darin, das Bibliotheksverzeichnis in "../Release" zu ändern, sodass ich die von der Version erstellte Bibliothek und nicht die zuvor erstellte Debug-Bibliothek abfing.

ArtHare
quelle
Hatte ein ähnliches Problem, bei dem meine statische Bibliothek an derselben Stelle landete, unabhängig davon, ob sie veröffentlicht oder debuggt wurde. In diesem Fall sollte man sie anders benennen, indem man 'd' oder so anfügt. Andernfalls müssten Sie die Bibliothek auch jedes Mal neu erstellen, wenn Sie zwischen Debug / Release wechseln.
Yau
4

Ich hatte das gleiche Problem zwischen Debug- und Release-Bibliotheken. Der Fehler lag in den Lösungseigenschaften / Konfigurationseigenschaften / Konfigurationen.

Die Projektkonfigurationen stimmten nicht mit der Hauptkonfiguration / Plattform überein.

Alstrice
quelle
3

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

AlexT
quelle
3

Letzte Chance (wenn andere Möglichkeiten nicht funktionieren): Definieren Sie in allen Projekten das Makro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH. Dadurch wird die Funktion "#pragma detect_mismatch" deaktiviert, die in CRT-Headern verwendet wird.

Andrey
quelle
Ich habe so ziemlich alles auf dieser Seite ausprobiert, und dies war das einzige, was funktioniert hat. Fügen Sie _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHunter hinzu C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

opencv_core245.lib (dxt.obj): Fehler LNK2038: Nichtübereinstimmung für '_ITERATOR_DEBUG_LEVEL' festgestellt: Wert '0' stimmt nicht mit Wert '2' in test.obj überein. Ich habe einen solchen Fehler erhalten.
Ich habe opencv_core245.lib und opencv_core245d.lib in Linker-> Eingabe-> Zusätzliche Abhängigkeit. Da diese beiden verwirrend waren, entfernte ich zuerst eine opencv_core245.lib. Fehler weg.

Vinit M.
quelle
2

Versuchen Sie Folgendes: Gehe zu Projekteigenschaft -> C / C ++ -> Codegenerierung -> Laufzeitbibliothek Aus Combobox-Wert auswählen: Multithread-DLL (/ MD) Es funktioniert für mich :)

Phạm Mạnh
quelle
2

In meinem Fall bestand die Lösung sowohl für Debug als auch für Release darin, die gesamte Lösung zu bereinigen und dann neu zu erstellen.

Edit: true auch in meinem Fall (VS2017) Schritt 1: Bereinigen Sie das Projekt. Schritt 2: Ändern Sie den Konfigurationsmodus (von Debug zu Release oder umgekehrt). Schritt 3: Reinigen Sie das Projekt. Schritt 4: Erstellen Sie den erforderlichen Konfigurationsmodus.

PS: Um den Konfigurationsmodus zu ändern, finden Sie die Konfigurationseinstellungen im Build-Menü

Ionut V.
quelle
1

Ich hatte heute das gleiche Problem (VS2010), ich habe Release | erstellt Win32, dann versucht, Debug | zu erstellen Win32 und bekam diese Nachricht.

Ich habe versucht, Debug | zu reinigen Win32, aber der Fehler blieb bestehen. Ich habe dann Release | gereinigt Win32, dann bereinigt Debug | Win32, und dann hat es gut gebaut.

GilesDMiddleton
quelle
1

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

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

JTatie
quelle
1

Ich habe mein Problem bei der Korrektur des "Zusätzlichen Bibliotheksverzeichnisses" behoben. Dieses hat "$ (SolutionDir) \ Release" falsch angegeben und in "$ (SolutionDir) \ $ (IntDir)" geändert.

Öffnen Sie zur Korrektur Ihre Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Allgemein -> Zusätzliches Bibliotheksverzeichnis

Ich hoffe das wird einigen Leuten mit den gleichen Schwierigkeiten helfen;)

ThierryV
quelle
Für mich funktioniert das Debuggen einwandfrei, aber beim Erstellen der Version wird der obige Fehler angezeigt. Ich habe das zusätzliche Bibliotheksverzeichnis geöffnet, das ich gefunden habe: C: / Programme / PCL 1.8.1 / lib / $ (Konfiguration) Was soll ich jetzt hinzufügen? Hier?
sqp_125
0

Ich hatte auch dieses Problem und es entstand, weil ich das Projekt neu erstellt und dann vergessen habe, es in einem abhängigen Projekt durch Referenz neu zu verknüpfen.

Somit wurde unter Bezugnahme auf das alte Projekt anstelle des neuen verknüpft.

Es ist wichtig zu wissen, dass beim erneuten Hinzufügen eines zuvor verknüpften Projekts als Referenz ein Fehler vorliegt. Sie müssen die Referenz im vcxproj manuell löschen und können sie erst dann wieder hinzufügen. Dies ist laut msdn ein bekanntes Problem in Visual Studio.

AtomicBoolean
quelle
0

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

Öffnen Sie die .lib-Datei in einem Editor (ich habe PSPad verwendet, Bud Windows Notepad ist ebenfalls möglich) und ersetzen Sie alle Vorkommen von _ITERATOR_DEBUG_LEVEL = 2 durch _ITERATOR_DEBUG_LEVEL = 0

Servietten
quelle
0

In meinem Fall musste die NDEBUG-Makrodefinition in den "Präprozessordefinitionen" in _DEBUG geändert werden. Ich erstelle eine statische Bibliothek zur 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üpunkt "Eigenschaften") und klicken Sie dann auf den Abschnitt C / C ++, dann auf den Abschnitt Präprozessor darunter. Bearbeiten Sie dann Ihre Präprozessordefinitionen, sodass NDEBUG in _DEBUG geändert wird (entsprechend dem Einstellung in der exe).

Aljoschak
quelle
0

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

Das Entfernen dieses Problems hat das Problem behoben.

Coxy
quelle
-1

Kleine Ergänzung zur obigen Hilfe: Ich habe den Mismatch-Fehler erhalten, nachdem ich einer älteren VST-Lösung mit VST 2017 ein statisches Libt hinzugefügt habe. VST generiert jetzt "stdfax.h" für vorkompilierte Header, die diese 2 Zeilen enthalten:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
FunctionPoint
quelle