web-dev-qa-db-fra.com

erreur LNK2038: incompatibilité détectée pour '_ITERATOR_DEBUG_LEVEL': la valeur '0' ne correspond pas à la valeur '2' dans main.obj

J'ai lu beaucoup de solutions à mon problème mais aucune n'a aidé. J'ai essayé de nettoyer, reconstruire. Réinstallez Visual 2010 et passez de professionnel à ultime. Mais je ne sais toujours pas pourquoi j'ai cette erreur. Mon projet ressemble à ceci: 1 Solution Exe pour tester ma bibliothèque statique . 1 Dll Solution bibliothèque statique . Le code qui est converti en dll utilise une fonction de 1 lib appelée ClassificationFramework. J'ai fourni cette lib en tant qu'en-têtes et cpp donc fondamentalement le code source. Dans la solution Exe j'ai lié ma bibliothèque générée + quelques autres bibliothèques pour l'exécuter + ClassificationFramework.dll. Tout fonctionne bien lorsque j'utilise Release, mais lorsque je passe à Debug (parce que je veux déboguer des choses, j'en ai marre de sauter le débogueur en mode release), je reçois ceci:

    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

Lorsque je construis dans Release, j'ai également reçu ces avertissements:

    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

J'ai trouvé que le débogueur saute à cause du mauvais chemin d'accès aux fichiers 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).

Quand je vais à Debug-> Windows-> Modules, je vois qu’il ne trouve pas ces fichiers pdb ou autre chose. Comment puis-je lui dire que ces fichiers sont ici et ici? J'ai essayé d'exécuter MSvisual en tant qu'administrateur, mais cela n'a pas non plus aidé. J'ai utilisé le serveur Microsoft pour charger des fichiers pdb mais je n'ai pas non plus aidé.

108
Qbunia

Dans VS2010, le niveau de débogage de l’itérateur est défini par défaut sur 2 dans le débogage et est désactivé dans la version. Le débogage par itérateur est probablement désactivé dans l'une des dll que vous utilisez, soit parce qu'il a été construit dans une version plus ancienne de visual studio, soit parce qu'ils ont explicitement ajouté les définitions au projet.

Recherchez _ITERATOR_DEBUG_LEVEL et _SECURE_SCL supprimez-les ou configurez-les correctement dans tous les projets et sources et reconstruisez tout.

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

En bref, vous êtes probablement en train de mélanger des DLL de publication et de débogage. Ne pas lier les dll release en débogage ou vice versa!

133
AJG85

Je fais une petite mise à jour sur ce problème, car je venais de commettre la même erreur aujourd'hui sur une application liant une bibliothèque statique, après avoir migré l'ancien projet Visual 6 vers Visual Studio 2012.

Dans mon cas, l'erreur est que j'ai compilé par erreur la version Release de la bibliothèque statique avec/MDd au lieu de/MD , alors que l'application est/MD in release. La définition du correct/MD dans le projet de bibliothèque statique a résolu le problème.

Ceci est fait dans Propriétés du projet

  • Sélectionnez Propriétés de configuration/C C++/Génération de code dans l'arborescence
  • et l'option Bibliothèque d'exécution définie sur identique pour tous vos projets et applications de dépendances.
92
Francis Pierot

Si vous souhaitez lier délibérément votre projet A dans la version à un autre projet B dans le débogage, par exemple, pour conserver les avantages de performance globale de votre application lors du débogage, il est probable que vous rencontriez cette erreur. Vous pouvez résoudre ce problème en modifiant temporairement les indicateurs de préprocesseur du projet B pour désactiver le débogage par itérateur (et le faire correspondre au projet A):

Dans les propriétés "Débogage" du projet B, Propriétés de configuration -> C/C++ -> Préprocesseur, ajoutez ce qui suit aux définitions de préprocesseur:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Reconstruisez le projet B dans le débogage, puis construisez le projet A dans la version et il devrait être lié correctement.

19
Antonio Maiorano

J'avais un décalage entre les projets: l'un avec un jeu de caractères multi-octets, l'autre avec Unicode. Corriger ces problèmes pour s’accorder sur Unicode a corrigé le problème.

10
stoney

L'erreur peut être provoquée en mélangeant les versions de débogage et de version dans le même exécutable ou la même DLL.

  1. dans le gestionnaire de configuration vs, certains de vos projets sont-ils en mode débogage et d'autres en mode édition?
  2. le symbole de préprocesseur DEBUG ou _DEBUG est-il défini dans l'un de vos projets de version?
  3. l'un de vos projets de débogage comporte-t-il le symbole de préprocesseur NDEBUG?
9
Aviad Rozenhek

J'ai eu ce problème aussi.

Mon problème était que j'avais copié/collé les répertoires include de la bibliothèque à partir de mes configurations de débogage.

Le projet "Indep" incluait donc la bibliothèque statique "Dep.lib" de "../Debug", même dans la version. Le correctif consistait à changer le répertoire de la bibliothèque en "../Release". J'ai donc intercepté la bibliothèque créée par l'édition plutôt que la bibliothèque de débogage précédemment construite.

7
ArtHare

Essayez de modifier la définition de macro _DEBUG en NDEBUG dans les propriétés de projet C++ (pour la configuration de version).

3
AlexT

Dans mon cas, pour Debug et Release, la solution consistait à nettoyer puis à reconstruire la solution entière. 

Edit: true dans mon cas également (VS2017) Étape1: nettoyer le projet . Étape2: changer le mode de configuration (de déboguer à libérer ou vice versa) . Étape3: nettoyer le projet . : construire dans le mode de configuration requis. 

PS: pour changer le mode de configuration, trouver les paramètres de configuration dans le menu de construction

2
Ionut V.

Dernière chance (si les autres moyens ne fonctionnent pas): Définissez la macro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH dans tous les projets. Il désactivera la fonctionnalité "#pragma detect_mismatch" utilisée dans les en-têtes CRT.

2
Andrey

opencv_core245.lib (dxt.obj): erreur LNK2038: une incompatibilité détectée pour '_ITERATOR_DEBUG_LEVEL': la valeur '0' ne correspond pas à la valeur '2' dans test.obj J'ai une erreur comme celle-ci.
J'ai opencv_core245.lib et opencv_core245d.lib dans Linker-> Entrée-> Dépendants supplémentaires. Depuis que ces deux étaient confus, j'ai enlevé le premier opencv_core245.lib. Erreur parti.

2
Vinit M

J'ai eu le même problème aujourd'hui (VS2010), j'ai construit Release | Win32, puis essayé de construire Debug | Win32 et j'ai eu ce message.

J'ai essayé de nettoyer Debug | Win32 mais l'erreur persistait toujours . J'ai ensuite nettoyé Release | Win32, puis nettoyé Debug | Win32, puis tout a bien été construit.

1
GilesDMiddleton

J'ai réussi à supprimer cette erreur (dans mon cas, en utilisant Ogre3D + Bullet) en modifiant les bibliothèques de dépendances en versions de débogage dans Propriétés du projet -> Éditeur de liens -> Entrée -> Dépendances supplémentaires (VC10).

J'ai changé BulletCollision.lib en BulletCollision_debug.lib (pour la configuration de débogage) et le compile.

1
JTatie

J'ai eu le même problème entre les bibliothèques de débogage et de publication. L'erreur était dans les propriétés de la solution/Propriétés de la configuration/Configurations.

Les configurations de projet ne correspondaient pas à la configuration/plateforme principale.

1
Alstrice

J'ai résolu mon problème en corrigeant le "Répertoire de bibliothèque supplémentaire", celui-ci se trompant en indiquant "$ (SolutionDir)\Release", je l'ai changé dans "$ (SolutionDir)\$ (IntDir)"

Pour le corriger, ouvrez les propriétés de votre projet -> Propriétés de configuration -> Éditeur de liens -> Général -> Répertoire de bibliothèque supplémentaire

J'espère que cela aidera des gens avec le même problème;)

0
ThierryV

Dans mon cas, la définition de la macro NDEBUG dans les "Définitions du préprocesseur" devait être remplacée par _DEBUG. Je construis une bibliothèque statique à utiliser dans un fichier .exe qui se plaignait de la même erreur que celle indiquée dans la question. Accédez à Propriétés de configuration (menu "Projet", élément de menu "Propriétés"), puis cliquez sur la section C/C++, puis sur la section de préprocesseur située en dessous, puis modifiez vos définitions de préprocesseur de sorte que NDEBUG soit remplacé par mise en exe).

0
Alyoshak

J'ai également eu ce problème et il est survenu parce que j'ai refait le projet puis oublié de le re-lier par référence dans un projet dépendant. 

Ainsi, il s'agissait d'une liaison par référence à l'ancien projet au lieu du nouveau. 

Il est important de savoir qu'il existe un bogue lors de la ré-addition d'un projet précédemment lié par référence. Vous devez supprimer manuellement la référence dans vcxproj et vous pourrez ensuite l'ajouter de nouveau. Ceci est un problème connu dans Visual studio selon msdn. 

0
Chris Woolfe

J'ai eu le même problème, mais le mauvais paramètre était dans le fichier externe .lib à partir duquel je n'avais pas de sources. Si vous n'avez pas les fichiers source , la solution de contournement la plus simple consiste à modifier simplement le contenu du fichier .lib.

Ouvrez le fichier .lib dans un éditeur (j'ai utilisé PSPad, le bloc-notes Windows est également possible) et remplacez toutes les occurrences de _ITERATOR_DEBUG_LEVEL = 2 à _ITERATOR_DEBUG_LEVEL = 0

0
napets

Comme toutes les autres réponses, j'ai vérifié mes directives Configuration Properties -> C/C++ -> Preprocessor.
Dans mon cas, la NDEBUG était correctement définie dans Release, mais j'avais aussi: _SECURE_SCL=1.

La suppression de celui-ci a résolu le problème.

0
Coxy