errore LNK2038: mancata corrispondenza rilevata per '_ITERATOR_DEBUG_LEVEL': il valore '0' non corrisponde al valore '2' in main.obj


131

Ho letto molte soluzioni al mio problema, ma nessuna mi ha aiutato. Ho provato a pulire, ricostruire. Reinstallato Visual 2010 e passa da professionale a definitivo. Ma ancora non so perché ho questo errore. Il mio progetto è simile al seguente: 1 soluzione Exe per testare la mia libreria statica. 1 libreria di soluzioni statiche Dll. Il codice che viene convertito in dll sta usando la funzione da 1 lib chiamata ClassificationFramework. Ho fornito questa lib come headers e cpp, quindi sostanzialmente il codice sorgente. Nella soluzione Exe ho collegato la mia libreria generata + alcune altre librerie per eseguirla + ClassificationFramework.dll. Tutto funziona bene quando uso Release ma quando cambio Debug (perché voglio eseguire il debug di alcune cose, sono stanco di saltare il debugger in modalità di rilascio) Ottengo questo:

    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

Quando compilo in Release, ho ricevuto anche questi avvisi:

    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

Ho scoperto che il debugger salta a causa del percorso errato dei file 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).

Quando vado in Debug-> Windows-> Moduli vedo che non riesce a trovare quei file pdb o qualcosa del genere. Come posso dirgli che quei file sono qui e qui? Ho provato a eseguire MSvisual come amministratore, ma anche quello non ha aiutato. Ho usato il server Microsoft per caricare i file pdb, ma non ha aiutato.

Risposte:


148

Nel livello di debug dell'iteratore VS2010 il valore predefinito è 2 nel debug ed è disabilitato nel rilascio. Una delle DLL che stai utilizzando probabilmente ha il debug iteratore disattivato nel debug o perché è stato creato in una versione precedente di Visual Studio o hanno aggiunto esplicitamente le definizioni al progetto.

Cerca _ITERATOR_DEBUG_LEVELe _SECURE_SCLrimuovili o impostali in modo appropriato in tutti i progetti e le fonti e ricostruisci tutto.

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

In breve, probabilmente state mescolando dll di rilascio e debug. Non collegare le DLL di rilascio in debug o viceversa!


6
Non vedo in alcun file .h o .cpp di _ITERATOR_DEBUG_LEVEL o _SECURE_SCL Esistono solo nei file obj come: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" Che ne dici di
Qbunia

Che dire di saltare i punti di interruzione dal debugger in rilascio? Alcuni punti di interruzione non sono riempiti e dice che il debugger li evita a causa dell'ottimizzazione o del collegamento di qualcosa del genere
Qbunia,

42
"In breve probabilmente stai mescolando dll di rilascio e debug" mi ha aiutato. Grazie!
Max

2
Waiwaiwait! Intendi dirmi che quando sto usando MSVC, per ottenere una build di debug devo ricompilare TUTTE le dipendenze? Anche quelli a cui non mi interessa eseguire il debug? Che merda! Non ci posso credere!
Michael,

1
"In breve probabilmente stai mescolando dll di release e debug" -> Nel mio caso RuntimeLibrary era MultiThreadedDebugDLL nella build di Release quando avrebbe dovuto essere MultiThreadedDLL.
Capitano Normale,

108

Faccio un piccolo aggiornamento su questo problema, dato che oggi ho avuto lo stesso errore su un'applicazione che si collega a una libreria statica, dopo aver migrato il vecchio progetto Visual 6 in Visual Studio 2012.

Nel mio caso l'errore era che ho compilato erroneamente la versione di rilascio della lib statica con / MDd invece di / MD , mentre l'applicazione è / MD in versione. L'impostazione del corretto / MD nel progetto lib statico ha risolto il problema.

Questo viene fatto nelle proprietà del progetto

  • Selezionare Proprietà di configurazione / C C ++ / Generazione di codice nella struttura
  • e l'opzione Libreria runtime impostata sullo stesso su tutti i progetti e l'applicazione delle dipendenze.

21

Se desideri collegare intenzionalmente il tuo progetto A in versione con un altro progetto B in debug, supponi di mantenere i benefici complessivi delle prestazioni della tua applicazione durante il debug, quindi probabilmente colpirai questo errore. È possibile risolvere questo problema modificando temporaneamente i flag del preprocessore del progetto B per disabilitare il debug dell'iteratore (e farlo corrispondere al progetto A):

Nelle proprietà "Debug" del Progetto B, Proprietà di configurazione -> C / C ++ -> Preprocessore, aggiungere quanto segue a Definizioni preprocessore:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Ricostruire il progetto B in debug, quindi compilare il progetto A in versione e dovrebbe collegarsi correttamente.


11

Ho avuto una discrepanza tra i progetti: uno con set di caratteri multi-byte, l'altro con Unicode. La correzione di questi per concordare Unicode ha corretto il problema.


2
Si scopre che il progetto che stavo tentando di realizzare aveva questo problema e un preprocessore mancante inaspettato nel debug: _DEBUG. Vedi forums.codeguru.com/…
JGeerWM il

Ho avuto un problema simile a messing in Matlab, ma viceversa: per ottenere l'accordo, avevo bisogno di cambiare la build del VS2013 in multi-byte. Ciò ha anche risolto una mancata corrispondenza per RuntimeLIbrary.
Barnhillec,

10

L'errore può essere causato dalla combinazione di build di debug e versioni di build nello stesso eseguibile o dll.

  1. in vs configuration manager, alcuni dei tuoi progetti sono in modalità debug e altri in modalità release?
  2. uno dei tuoi progetti di rilascio ha definito il simbolo del preprocessore DEBUG o _DEBUG?
  3. è uno dei tuoi progetti di debug definito il simbolo del preprocessore NDEBUG?

7

Ho avuto anche questo problema.

Il mio problema era che avevo copiato / incollato la libreria includendo le directory dalle mie configurazioni di debug.

Quindi il progetto "Indep" includeva la libreria statica "Dep.lib" da "../Debug", anche in versione. La correzione consisteva nel cambiare la directory della libreria in "../Release", quindi ho individuato la libreria di rilascio anziché la libreria di debug precedentemente creata.


Ha avuto un problema simile, in cui la mia lib statica è arrivata nello stesso posto indipendentemente dal rilascio o dal debug. In tal caso, è necessario denominarli diversamente aggiungendo 'd' o simili. Altrimenti saresti anche costretto a ricostruire la lib ogni volta che passi da debug / release.
yau,

4

Ho avuto lo stesso problema tra le librerie di debug e di rilascio. L'errore era nelle proprietà della soluzione / Proprietà delle configurazioni / Configurazioni.

Le configurazioni dei progetti non corrispondevano alla configurazione / piattaforma principale.


3

Prova a modificare la definizione della macro _DEBUG in NDEBUG nelle proprietà del progetto C ++ (per la configurazione della versione) Proprietà di configurazione -> C / C ++ -> Preprocessore -> Definizioni preprocessore


3

Ultima possibilità (se gli altri modi non funzionano): definire la macro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH in tutti i progetti. Disabiliterà la funzione "#pragma detect_mismatch" utilizzata nelle intestazioni CRT.


Ho provato praticamente tutto su questa pagina, e questa è stata l'unica cosa che ha funzionato. Aggiungi _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHsotto C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango,

2

opencv_core245.lib (dxt.obj): errore LNK2038: mancata corrispondenza rilevata per '_ITERATOR_DEBUG_LEVEL': il valore '0' non corrisponde al valore '2' in test.obj Ho ricevuto un errore del genere.
Ho opencv_core245.lib e opencv_core245d.lib in Linker-> Input-> dipendenza aggiuntiva. Dal momento che questi due erano confliggenti, ho rimosso il primo opencv_core245.lib. Errore andato.


2

Prova questo: Vai alla proprietà del progetto -> C / C ++ -> Generazione di codice -> Libreria di runtime Seleziona dal valore della casella combinata: DLL multi-thread (/ MD) Funziona per me :)


2

Nel mio caso, sia per il debug sia per il rilascio, la soluzione era di pulire e ricostruire l'intera soluzione.

Modifica: vero anche nel mio caso (VS2017) step1: pulisci il progetto. step2: cambia la modalità di configurazione (dal debug al rilascio o viceversa). step3: pulire il progetto. step4: compilare nella modalità di configurazione richiesta.

PS: per cambiare la modalità di configurazione, trova le impostazioni di configurazione nel menu di creazione


1

Ho avuto lo stesso problema oggi (VS2010), ho realizzato Release | Win32, quindi ha provato a creare Debug | Win32 e ho ricevuto questo messaggio.

Ho provato a pulire Debug | Win32 ma l'errore persiste ancora. Ho quindi pulito Release | Win32, quindi pulito Debug | Win32 e quindi ha funzionato bene.


1

Sono riuscito a sbarazzarmi di questo errore (nel mio caso usando Ogre3D + Bullet) modificando le librerie delle dipendenze con le versioni di debug in Proprietà progetto -> Linker -> Input -> Dipendenze aggiuntive (VC10).

Ho modificato BulletCollision.lib in BulletCollision_debug.lib (per la configurazione di debug) e l'ho compilato.


1

Ho risolto il mio problema nel correggere la "Directory libreria aggiuntiva", questa era errata nell'indicare "$ (SolutionDir) \ Release", l'ho cambiata in "$ (SolutionDir) \ $ (IntDir)"

Per correggerlo, apri le proprietà del tuo progetto -> Proprietà di configurazione -> Linker -> Generale -> Directory libreria aggiuntiva

Spero che questo possa aiutare alcune persone con lo stesso problema;)


quindi per me il debug funziona bene ma quando si genera in rilascio ottengo l'errore sopra ... Ho aperto Directory libreria aggiuntiva che ho trovato: C: / Programmi / PCL 1.8.1 / lib / $ (Configurazione) cosa dovrei aggiungere ora Qui?
sqp_125,

0

Ho avuto anche questo problema ed è emerso perché ho ri-creato il progetto e poi ho dimenticato di ricollegarlo come riferimento in un progetto dipendente.

Quindi si collegava facendo riferimento al vecchio progetto anziché a quello nuovo.

È importante sapere che esiste un errore nel ri-aggiungere un progetto precedentemente collegato come riferimento. Devi eliminare manualmente il riferimento in vcxproj e solo allora puoi aggiungerlo di nuovo. Questo è un problema noto in Visual Studio secondo msdn.


0

Ho avuto un problema simile, ma l'impostazione errata era nel file .lib esterno da cui non avevo fonti. Se non si dispone dei file di origine , la soluzione più semplice è semplicemente modificare il contenuto del file .lib.

Apri il file .lib in un editor (ho usato PSPad, è possibile anche il blocco note di Windows bud) e sostituisci tutte le occorrenze di _ITERATOR_DEBUG_LEVEL = 2 a _ITERATOR_DEBUG_LEVEL = 0


0

Nel mio caso, la definizione di macro NDEBUG nelle "Definizioni del preprocessore" doveva essere modificata in _DEBUG. Sto costruendo una libreria statica da utilizzare in un file .exe che si lamentava dello stesso errore elencato nella domanda. Vai a Proprietà di configurazione (menu "Progetto", voce di menu "Proprietà"), quindi fai clic sulla sezione C / C ++, quindi sulla sezione Preprocessore in quella sezione, quindi modifica le definizioni del preprocessore in modo che NDEBUG venga modificato in _DEBUG (per corrispondere al ambientazione nell'exe).


0

Come tutte le altre risposte, ho controllato le mie Configuration Properties -> C/C++ -> Preprocessordirettive.
Nel mio caso avevo NDEBUGdefinito correttamente in Release, ma avevo anche:_SECURE_SCL=1 .

Rimuovendo quello risolto il problema.


-1

Piccola aggiunta alla guida di cui sopra: ho riscontrato l'errore di mancata corrispondenza dopo l'aggiunta di una libto statica a una soluzione VST precedente utilizzando VST 2017. VST ora genera "stdfax.h" per le intestazioni precompilate contenenti queste 2 righe:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.