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.