IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

discordance détectée pour '_ITERATOR_DEBUG_LEVEL'


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut discordance détectée pour '_ITERATOR_DEBUG_LEVEL'
    Bonjour,

    Je développe une application A. Cette application dépend d'une librarie L compilée en mode release.
    Lorsque j'essaie de compiler A en mode debug avec NMake et cl.exe, j'obtiens l'erreur suivante :
    error LNK2038: discordance détectée pour '_ITERATOR_DEBUG_LEVEL'*: la valeur '0' ne correspond pas à la valeur '2' in main.cpp.obj
    Je ne dispose pas des sources de L. Je ne peux donc pas la recompiler en mode debug (ce qui réglerait le problème de discordance).

    Existe-t-il un moyen lancer A en mode debug ? Sous Visual Studio ? Sous Eclipse ?

    Merci par avance pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Etrange. C'est courant, en mode debug, de reposer sur des bibliothèques en mode release.

    Ce fil de discussion parle d'une histoire d'en-têtes précompilées...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Merci pour ta réponse.

    Malheureusement, je ne pense pas qu'il s'agisse du même problème.
    D'après ce que j'ai compris, il manquait une directive pragma dans l'un des fichiers .cpp de l'auteur (cette même directive étant présente dans tous ses autres fichiers). Je n'ai aucune directive pragma dans mon code.
    Après quelques recherches j'ai trouvé cette page : http://daikof622.wordpress.com/2011/...-0-in-xxx-obj/. Il y est indiqué de paramétrer _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH pour désactiver la vérification de _ITERATOR_DEBUG_LEVEL, mais je ne vois pas comment paramétrer _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH.

    Une idée ?

    Merci par avance.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Il faut le mettre en tant que symboles définis dans les propriétés du projet. Ou rajouter /D... à la ligne de commande.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 51
    Par défaut
    Bonjour Emmanuel et merci pour ta réponse.

    Je souhaite générer un projet Eclipse avec CMake.
    J'aimerais donc ne pas avoir à modifier les propriétés de mon projet via l'IDE.
    Je suis parvenu à rajouter le symbole _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH via le CMakeLists.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADD_DEFINITIONS(-D_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH)
    J'obtiens toujours le même type d'erreur, mais pas sur le même fichier "obj".
    Sans le symbole, le message d'erreur est :
    error LNK2038: discordance détectée pour '_ITERATOR_DEBUG_LEVEL' : la valeur '0' ne correspond pas à la valeur '2' in main.cpp.obj
    Avec le symbole, le message d'erreur est :
    error LNK2038: discordance détectée pour '_ITERATOR_DEBUG_LEVEL'*: la valeur '0' ne correspond pas à la valeur '2' in libboost_system-vc100-mt-gd-1_44.lib(error_code.obj)
    Je ne comprends pas ce qui se passe.

    Quelqu'un pourrait-il m'éclairer ?

    Merci par avance.

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    J'espère que tu sais bien ce que tu fais, nymformaticien, à vouloir désactiver le check sur _ITERATOR_DEBUG_LEVEL, car il est là pour te protéger.

    Mélanger des bibliothèques debug et release sous Windows avec Visual c'est le meilleur moyen de se prendre des crashs méchants.

    Un exemple concret :
    Je crée le projet "LibRelease" qui va me générer une bibliothèque statique contenant la fonction ci-dessous "fillVector". Je génère cette lib en Release.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include "LibRelease.h"
    #include <iostream>
     
    std::vector<int> fillVector(std::vector<int>& v)
    {
       std::cout << "Release : std::vector<int> size = " << sizeof(std::vector<int>) << std::endl;
       std::cout << "Release : std::vector<int>::iterator size = " << sizeof(std::vector<int>::iterator) << std::endl;
       v.clear();
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       v.push_back(4);
       return v;
    }

    Ensuite je crée un projet ProjectUsingLibRelease comme ci-dessous, qui est linké avec ma lib LibRelease.lib. Je compile ce projet en Debug. Aussi, je rajoute _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH dans mon projet car sinon j'ai cette erreur bizarre de link, "error LNK2038: discordance détectée pour '_ITERATOR_DEBUG_LEVEL" que je ne comprends pas, mais, après tout, ça ne doit pas servir à grand chose n'est-ce pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "LibRelease.h"
    #include <vector>
    #include <iostream>
    int main()
    {
       std::cout << "Debug : std::vector<int> size = " << sizeof(std::vector<int>) << std::endl;
       std::cout << "Debug : std::vector<int>::iterator size = " << sizeof(std::vector<int>::iterator) << std::endl;
       std::vector<int> v;
       std::vector<int> v2 = fillVector(v);
       for(auto it = v2.begin(), e = v2.end(); it != e; ++it)
       {
          std::cout << *it << std::endl;
       }
    }
    Résultat de l’exécution de ProjectUsingLibRelease.exe :

    Debug : std::vector<int> size = 20
    Debug : std::vector<int>::iterator size = 12
    Release : std::vector<int> size = 16
    Release : std::vector<int>::iterator size = 4
    1
    2
    3
    4

    L'appli crash : "ProjectUsingLibRelease.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagréablement encouru."
    L'explication c'est qu'en fonction du niveau de la macro _ITERATOR_DEBUG_LEVEL les conteneurs de la STL ainsi que leur itérateurs n'ont pas la même taille, ce qui fait le passage d'argument entre l'appli en debug et la lib en release dans la fonction fillVector() fout complètement le boxon en mémoire dans la pile et fini par faire crasher l'appli.

    En résumé, la solution correcte est de compiler boost à la fois en debug et en release et de linker dans ton appli avec libboost_system-vc100-mt-gd-1_44.lib en debug et avec libboost_system-vc100-mt-1_44.lib en release.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AS3] MC qui détecte état d'autres MC pour changer d'etat
    Par cool_yao dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 08/11/2011, 22h33
  2. Réponses: 1
    Dernier message: 30/05/2008, 18h15
  3. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  4. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo