web-dev-qa-db-fra.com

Erreur _ITERATOR_DEBUG_LEVEL dans Visual Studio

J'essaie de compiler JRTPLIB dans Visual Studio 2010 sur Windows 7. C'est un véritable cauchemar ... mais je suis au moins en train de réduire les problèmes.

Ceci est laissé.

Error   3   error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in client.obj   C:\Users\Johan-bar\Documents\Visual Studio 2010\Projects\client\client\jrtplib.lib(rtpsession.obj)  client

J'ai googlé une tonne et la cause semble être l'un est compilé en mode débogage tandis que l'autre est compilé en mode release.

Je vise à compiler un exécutable Release parce que je veux tester sur différents ordinateurs.

1) Lequel n'est pas en mode Release, JRTPLIB ou client (le mien, celui qui tente de compiler)?

2) Comment change-t-on ITERATOR_DEBUG_LEVEL? Les deux utilisent Runtime Library/MT et les définitions de préprocesseur WIN32, _MT, ainsi que les valeurs par défaut, je suppose.

À votre santé

21
KaiserJohaan

Compilez tout ce que vous utilisez avec l'option -D_ITERATOR_DEBUG_LEVEL = 0. Il en est ainsi par défaut dans le mode de publication de VS 2010, mais certaines choses sont toujours construites avec d'autres options et ne sont donc pas compatibles binaires.

Il y avait _SECURE_SCL dans les studios visuels plus anciens et je ne suis pas sûr que du code puisse encore l’utiliser. Mettez quelque part (par exemple dans stdafx.h) une vérification statique de leur correspondance. 

#if _ITERATOR_DEBUG_LEVEL == 0 && _SECURE_SCL != 0 
#error _SECURE_SCL != 0 while _ITERATOR_DEBUG_LEVEL == 0 
#endif 

Si vous voulez voir la valeur de _ITERATOR_DEBUG_LEVEL, vous pouvez utiliser un message #pragma dans le code pour vous l'indiquer. 

12
Öö Tiib

La solution:

Project Pages >> Configuration Properties >> C,C++ >> Preprocessor >> Preprocessor Definitions

Ajouter _ITERATOR_DEBUG_LEVEL=0 dedans a fonctionné. Voir aussi: Comment définir _ITERATOR_DEBUG_LEVEL dans VS2010?

7
RIK

J'ai trouvé un autre moyen de générer ces erreurs. 

J'utilisais la génération par lots de Visual Studio 2010 pour créer toutes les combinaisons possibles de plate-forme et de configuration, et j'obtenais ces erreurs. L'examen de la sortie a révélé que la construction par lots ne respectait pas les dépendances du projet - liant ainsi une bibliothèque obsolète de la version Release à un fichier obj Debug fraîchement compilé. 

Plusieurs lignes plus tard dans la sortie de construction, il a construit la version Debug de la bibliothèque.

Faire la "construction par lots" à la main (c’est-à-dire en sélectionnant manuellement les différentes combinaisons de plate-forme et de configuration) a produit une construction propre.

Morale: n'utilisez pas la génération par lots de Visual Studio 2010. Je ne sais pas si cela a été corrigé dans les versions ultérieures de VS.

0
Dale Wilson