incompatibilité détecté pour "_ITERATOR_DEBUG_LEVEL': la valeur '0' ne correspond pas à la valeur '2'
Bâtiment avec VS2010, je suis en train de construire une lib qui provoque beaucoup de ces erreurs de lien:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2'
Résultant dans une situation où je dois navire à la fois une libération et une version de débogage de ma lib.
Je n'ai aucune raison d'expédier une version de débogage de la lib, et il gonfle la distribution binaire. Mais le code client construit en debug refuse de lien à l'encontre de ma liberté lib.
J'ai vu cette question apparaissent avant, mais ils ne semblent pas poser la bonne question.
Je comprends ce que cette erreur est, et pourquoi je l'obtenir (enfin, en quelque sorte; je ne sais pas précisément ce qui émet de la dépendance. Faites-vous?), mais ce que je veux savoir, c'est comment faire pour éliminer cette dépendance se produise dans ma lib?
De même pour les libs qui se plaignent quand contradictoires tubes sont utilisés, qui peuvent être évitées avec /Zl (Omettre la valeur par défaut nom de la bibliothèque à partir de fichiers de l'objet), il y a certainement un moyen d'éviter cette dépendance d'être émis dans mes libs trop?
Je veux simplement produire un seul optimisé lib, qui est capable de lier contre debug ou release code. Ce n'est pas important pour le client, le code de débogage de la bibliothèque. Presque pas de 3ème partie les bibliothèques livrées avec des versions debug et release. Comment est-ce que les vendeurs éviter ce problème?
Personne ne sait précisément quelles sont les causes de ce lien de dépendance, et comment puis-je désactiver entièrement, ou facteur de mon code?
Oui, j'ai mal compris le problème. C'est juste une extension de MS est de la folie CRT situation. STL a modèle-ed structures dont la mise en page change en fonction de l'état de la _ITERATOR_DEBUG_LEVEL macro lorsque vous compilez votre code. Si vous incluez un STL-têtes puis votre code est codé en dur à l'état de _ITERATOR_DEBUG_LEVEL, et il ne PEUT tout simplement PAS interagir avec le code construit différemment. Il n'est pas question de debug/release, c'est à propos de différents struct dispositions intégrées dans le code compilé. De plus, le MS dbg/version C++ libs sont construits pour l'un ou l'autre etat.
En gros, si vous incluez toutes les STL-tête dans votre code, puis vous accepter un engagement à construire une suite de libs avec chaque structure de mise en page. Ce que vous POUVEZ faire, si vous ne voulez pas de navire debug/unoptimised code, est de faire 2 libération construit avec _ITERATOR_DEBUG_LEVEL défini manuellement pour chaque valeur, puis le nom du navire comme debug/release de façon appropriée. Même si elles sont toutes les deux vraiment "libération" s'appuie, la distinction est nécessaire pour faire correspondre STL structures de données pour le client reliant l'application.
TL;DR: il n'y a pas de "solution de contournement" autre que "ne comprend pas tout STL-têtes de n'importe où dans votre code"
OriginalL'auteur Manu Evans | 2014-02-23
Vous devez vous connecter pour publier un commentaire.
Vous liez un code qui a été compilé avec les paramètres de génération de débogage avec itérateur débogage activé avec un autre code qui a été compilé avec la version paramètre de construction.
Ce lien d'erreur vous empêche de souffler dans votre jambe comme ça. Ainsi, les deux jambes, bras gauche et de l'index de votre main droite, vous aurez à opérer à la souris avec votre menton. Les erreurs d'exécution, vous obtenez à partir de, disons, std::string objets ayant une mise en page différente sont très difficiles à diagnostiquer. La corruption de segment est un méchant problème, au sujet de la pire à déboguer. Vous devez recompiler le code avec des paramètres identiques, pas d'autre moyen.
Oui, ne pas répondre à la question. Je suis à la recherche d'une solution de ce. Je ne sais pas pourquoi il a obtenu 2 upvotes.
"Aucune autre solution" semble être une étrange phrase mystérieuse. Il n'est pas souvent que j'utilise des mots que explicite. La réponse est limpide, qu'il ne vous arrive pas à vous s'il vous plaît n'est pas de ma faute. Garce à Microsoft à ce sujet.
OriginalL'auteur Hans Passant
Même problème mais j'ai écrit des tests de régression et de scripts de ligne de commande de compilation et de liaison. J'ai juste oublié /D_DEBUG sur la ligne de compilation lorsque vous faites une version de débogage.
OriginalL'auteur Ed Harcourt
L'une des choses que j'ai découvert lorsque vous essayez de compiler un ensemble de boost code que j'ai trouvé d'ailleurs été qu'en interne il avait défini _SECURE_SCL=1, et _HAS_ITERATOR_DEBUGGING=1. Mon build était de débogage, et il aurait normalement l'itérateur niveau 2, mais cela inclus code que j'ai obtenu était primordial pour un 0! (et je n'ai pas remarqué jusqu'à ce creuser dans c'était de se lier à l'debug boost libs, qui avait intégré par défaut avec l'itérateur le niveau 2. Ainsi, un décalage se produit. Cette discordance peut également se produire si vous essayez de construire avec VS 2015+ boost libs qui ont été produits avant 2015. Mais c'est peu probable.
OriginalL'auteur eric frazer
Remplacer 0 à 2 dans lib fichiers nécessaires à la compilation.
J'ai fait dans l'éditeur hexadécimal. Mais, comme d'autres gars, dit problème ci-dessus que certains lib a été compilé avec certains paramètres obsolètes ont été que les param (vous n'utilisez jamais ) mis à 0 maintenant dernière MSVC de la compilation avec 2. Pour être honnête, ce qui doit être fait est de recompiler TOUTES les sources avec les derniers paramètres du compilateur.
OriginalL'auteur Boris Ivanov
Vous pouvez essayer de définir _ITERATOR_DEBUG_LEVEL à 0 dans les paramètres du projet pour la configuration de débogage ou...
C++
OriginalL'auteur def