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

131

J'ai lu beaucoup de solutions à mon problème mais aucune n'a aidé. J'ai essayé de nettoyer, de reconstruire. Visual 2010 réinstallé et passer 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 bibliothèque statique de la solution Dll. Le code qui est converti en dll utilise la fonction de 1 lib appelée ClassificationFramework. J'ai fourni cette lib comme 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 quand j'utilise Release mais quand je passe au Debug (parce que je veux déboguer certaines choses, je suis fatigué de sauter le débogueur en mode release), j'obtiens 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 compile 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 en raison d'un chemin incorrect vers les 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 dans Debug-> Windows-> Modules, je vois qu'il ne peut pas trouver ces fichiers pdb ou quelque 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 les fichiers pdb mais je n'ai pas non plus aidé.

Qbunia
la source

Réponses:

148

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. L'une des dll que vous utilisez a probablement le débogage d'itérateur désactivé dans le débogage, soit parce qu'il a été construit dans une ancienne version de Visual Studio, soit parce qu'ils ont explicitement ajouté les définitions au projet.

Recherchez _ITERATOR_DEBUG_LEVELet _SECURE_SCLsupprimez-les ou définissez-les de manière appropriée 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 mélangez probablement des DLL de mise à jour et de débogage. Ne liez pas les dll de publication dans le débogage ou vice versa!

AJG85
la source
6
Je ne vois dans aucun fichier .h ou .cpp aucun des _ITERATOR_DEBUG_LEVEL ou _SECURE_SCL Ils n'existent que dans les fichiers obj sous le nom: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" Et
Qbunia
Qu'en est-il du saut de points d'arrêt par le débogueur dans la version? Certains points d'arrêt ne sont pas remplis et dit que le débogueur les évite en raison de l'optimisation ou de la liaison de quelque chose comme ça
Qbunia
42
"En bref, vous mélangez probablement des DLL de mise à jour et de débogage" m'a aidé. Merci!
Max
2
Waiwaiwait! Vous voulez me dire que lorsque j'utilise MSVC, pour obtenir une version Debug, je dois recompiler TOUTES les dépendances? Même ceux que je ne veux pas déboguer? Qu'est-ce que cet homme de merde! Je ne peux pas croire ça!
Michael
1
"En bref, vous mélangez probablement des DLL de mise à jour et de débogage" -> Dans mon cas, la RuntimeLibrary était MultiThreadedDebugDLL dans la version Release alors qu'elle aurait dû être MultiThreadedDLL.
Captain Normal
108

Je fais une petite mise à jour sur ce problème, car je viens d'avoir la même erreur aujourd'hui sur une application qui se lie à 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 en version. La définition du / MD correct dans le projet de bibliothèque statique a résolu le problème.

Cela se fait dans les 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 Runtime Library définie sur la même valeur sur tous vos projets et applications de dépendances.
François Pierot
la source
21

Si vous souhaitez lier volontairement votre projet A dans Release à un autre projet B dans Debug, par exemple pour conserver les avantages de performances globales de votre application pendant le débogage, vous rencontrerez probablement 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 de l'itérateur (et le faire correspondre au projet A):

Dans les propriétés "Debug" 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 Debug, puis générez le projet A dans Release et il devrait être lié correctement.

Antonio Maiorano
la source
11

J'ai eu un décalage entre les projets: l'un avec un jeu de caractères multi-octets, l'autre avec Unicode. Corriger ces derniers pour convenir d'Unicode a corrigé le problème.

pierreux
la source
2
Il s'avère que le projet que j'essayais de construire avait ce problème ainsi qu'un préprocesseur manquant inattendu dans le débogage: _DEBUG. Voir forums.codeguru.com
JGeerWM
J'ai eu un problème similaire au mexing dans Matlab, mais dans l'autre sens: j'avais besoin de changer la version VS2013 en multi-octets pour obtenir l'accord. Cela a également résolu une incompatibilité pour RuntimeLIbrary.
barnhillec
10

L'erreur peut être causée par le mélange de versions de débogage et de versions de version dans le même exécutable ou dll.

  1. dans le gestionnaire de configuration vs, certains de vos projets sont-ils en mode débogage et certains en mode version?
  2. est-ce que l'un de vos projets de version a le symbole de préprocesseur DEBUG ou _DEBUG défini?
  3. est l'un de vos projets de débogage a le symbole de préprocesseur NDEBUG défini?
Aviad Rozenhek
la source
7

J'ai eu ce problème aussi.

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

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

ArtHare
la source
J'ai eu un problème similaire, où ma bibliothèque statique a atterri au même endroit, que ce soit la version ou le débogage. Dans ce cas, il faut les nommer différemment en ajoutant «d» ou autre. Sinon, vous seriez également obligé de reconstruire la bibliothèque à chaque fois que vous basculez entre le débogage et la publication.
yau
4

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 / les propriétés des configurations / les configurations.

Les configurations du projet ne correspondaient pas à la configuration / plate-forme principale.

Alstrice
la source
3

Essayez de changer la définition de macro _DEBUG en NDEBUG dans les propriétés du projet C ++ (pour la configuration de la version) Propriétés de configuration -> C / C ++ -> Préprocesseur -> Définitions du préprocesseur

AlexT
la source
3

Dernière chance (si les autres méthodes ne fonctionnent pas): définissez la macro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH dans tous les projets. Cela désactivera la fonction "#pragma detect_mismatch" qui est utilisée dans les en-têtes CRT.

Andreï
la source
J'ai essayé à peu près tout sur cette page, et c'est la seule chose qui a fonctionné. Ajouter _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHsous C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

opencv_core245.lib (dxt.obj): erreur LNK2038: discordance détectée pour '_ITERATOR_DEBUG_LEVEL': la valeur '0' ne correspond pas à la valeur '2' dans test.obj J'ai eu une erreur comme celle-ci.
J'ai opencv_core245.lib et opencv_core245d.lib dans Linker-> Input-> Additional dependenc. Comme ces deux éléments étaient confus, j'ai supprimé le premier opencv_core245.lib. Erreur disparue.

Vinit M
la source
2

Essayez ceci: Goto project property -> C / C ++ -> Code generation -> Runtime Library Sélectionnez à partir de la valeur combobox: DLL multi-thread (/ MD) Cela fonctionne pour moi :)

Phạm Mạnh
la source
2

Dans mon cas, pour le débogage et la version, la solution consistait à nettoyer puis à reconstruire toute la solution.

Edit: vrai dans mon cas aussi (VS2017) step1: nettoyer le projet. étape 2: changer le mode de configuration (du débogage à la version ou vice versa) étape 3: nettoyez le projet. étape 4: construisez dans le mode de configuration requis.

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

Ionut V.
la source
1

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

J'ai essayé de nettoyer Debug | Win32 mais l'erreur persiste. J'ai ensuite nettoyé Release | Win32, puis nettoyé Debug | Win32, puis il s'est bien construit.

GilesDMiddleton
la source
1

J'ai réussi à me débarrasser de cette erreur (dans mon cas en utilisant Ogre3D + Bullet) en changeant les bibliothèques de dépendances en versions de débogage dans Propriétés du projet -> Linker -> Input -> Additional Dependencies (VC10).

J'ai changé BulletCollision.lib en BulletCollision_debug.lib (pour la configuration de débogage) et il a été compilé.

JTatie
la source
1

J'ai résolu mon problème en corrigeant le "Répertoire de la bibliothèque supplémentaire", celui-ci était erroné 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 certaines personnes avec le même problème;)

ThierryV
la source
Donc, pour moi, le débogage fonctionne bien, mais lors de la construction de la version, j'obtiens l'erreur ci-dessus .... J'ai ouvert le répertoire de bibliothèques supplémentaires J'ai trouvé: C: / Program Files / PCL 1.8.1 / lib / $ (Configuration) que dois-je ajouter maintenant ici?
sqp_125
0

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

Ainsi, il était lié par référence à l'ancien projet au lieu du nouveau.

Il est important de savoir qu'il existe un bogue lors de l'ajout d'un projet précédemment lié par référence. Vous devez supprimer manuellement la référence dans le vcxproj et ce n'est qu'alors que vous pourrez la rajouter. Il s'agit d'un problème connu dans Visual Studio selon msdn.

AtomicBoolean
la source
0

J'ai eu un problème similaire, mais le mauvais réglage était dans le fichier externe .lib à partir duquel je n'avais pas de sources. Si vous ne disposez pas des fichiers source , la solution de contournement la plus simple consiste simplement à modifier 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 par _ITERATOR_DEBUG_LEVEL = 0

nappes
la source
0

Dans mon cas, la définition de macro NDEBUG dans les «définitions de préprocesseur» devait être modifiée en _DEBUG. Je construis une bibliothèque statique à utiliser dans un .exe qui se plaignait de la même erreur répertoriée dans la question. Allez dans 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 Préprocesseur sous celle-ci, puis modifiez vos définitions de préprocesseur afin que NDEBUG devienne _DEBUG (pour correspondre à la réglage dans l'exe).

Aliochak
la source
0

Comme toutes les autres réponses, j'ai vérifié mes Configuration Properties -> C/C++ -> Preprocessordirectives.
Dans mon cas , j'ai eu le NDEBUGcorrectement défini dans la version, mais je devais aussi: _SECURE_SCL=1.

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

Coxy
la source
-1

Petit ajout à l'aide ci-dessus: j'ai eu l'erreur d'incompatibilité après avoir ajouté une bibliothèque statique à une ancienne solution VST utilisant VST 2017. VST génère maintenant "stdfax.h" pour les en-têtes précompilés contenant ces 2 lignes:

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