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 :

Dll en mode debug et release


Sujet :

C++

  1. #1
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut Dll en mode debug et release
    Bonjour a tous,
    Je suis actuellement en train de develloper une dll pour la premiere fois. Enfin fini et apres avoir corriger quelques erreurs j'obtiens bien ma dll et ma librairie statique. Le probleme c'est qu'en la testant, la dll fonctionne seulement lorsque je suis en mode release (pour la dll crée en release) et en mode debug (pour la dll crée en mode debug). Il semblerait que dans les deux cas le probleme viennent de la perte de l'adresse des paramètres envoyés dans une fonction membre . La dll a été créée a l'aide de Visual 2005 (projet Win32 dll). J'ai cherché dans la faq ainsi que deux autres articles appartenant a developpez mais je ne crois pas avoir trouvé de reponse!
    Si cela peut vous aider voila comment j'ai defini ma configuration dans le projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //config.h
    ...
    #ifdef _WINDLL
    #define IMPORT_EXPORT __declspec(dllexport)
    #else
    #define IMPORT_EXPORT __declspec(dllimport)
    #endif
    Et dans la declaration de mes classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //class.h
    #include <config.h>
    ...
    class IMPORT_EXPORT MaClass{
    ...
    };
    J'avoue que j'ai un peu survolé l'étape de l'apprentissage pour créer une dll pour mieux me concentré sur le code ! Auriez-vous une idée d'ou se situe le probleme?
    Merci d'avance, bonne journée
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    J'aurais presque envie de dire que c'est normal.

    En effet, il y a souvent une option de compilation (-DDEBUG, par exemple) rajoutee pour indiquer que la dll est compilee en mode debug, ce qui a pour effet d'y inclure une serie de choses, allant des assertions jusqu'a certains symboles, necessaires... au debuggage.

    Tu devrais donc pouvoir utiliser la dll "debug" pour une application en mode release, mais, par contre, il est peu vraissemblable que l'utilisation de la dll release fonctionne avec une application en mode debug.

    L'idéal est donc, sans doute, de fournir un nom legerement different pour la dll en mode debug, de manière à pouvoir faire le distingo, et permettre à l'utilisateur de choisir celle qu'il veut utiliser

    Une convention que l'on rencontre souvent est, tout simplement, de rajouter la lettre d en fin de nom (madll.dll d'un cote, madlld.dll de l'autre),
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Je ne connais pas Windows et ne peux donc pas commenter sur la nature et les causes du probleme. J'ai par contre beaucoup de mal a considerer comme normal de ne pas pouvoir utiliser une bibliotheque "release", qu'elle soit dynamique ou non, dans un build debug. (L'inverse, ne pas pouvoir utiliser la bibliotheque debug dans le build release, me semble plus comprehensible mais neanmoins pas particulierement acceptable et encore moins desirable).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Note: au passage sur la façon dont est faite ta DLL: À moins que ta DLL s'appelle "IMPORT.DLL", je te déconseille d'appeler ton define "IMPORT_EXPORT". Tu devrais lui donner un nom unique, typiquement NOMDELADLL_API.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Merci pour vos reponse, si je n'ai pas le choix alors je vais faire comme ca, c'est en effet la méthode que j'employait pour créer des librairies statiques. Mais quelques choses me chagrine quand meme. Pourquoi certaines dll (et meme lib) fonctionnent très bien dans les deux cas de figures, il doit bien exister une solution non? par exemple la librairie glut32.dll ou SDL.dll peuvent etre utilisées en mode debug et release...
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je dirais que ça doit surtout dépendre de la façon dont la DLL en question utilise la C Run-Time Library (CRT). Car si tu mélanges Debug et Release, tu auras deux versions de la CRT chargées dans le même processus...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    C'est vrai que le terme "normal" est particulièrement inadapté...

    j'aurais du utiliser le terme "compréhensible" (et encore )

    Toujours est-il que cela peut, entre autre, venir de la manière dont ta bibliothèque est liée avec celle dont elle dépend en mode release et en mode debug...

    S'il se fait, d'une manière ou d'une autre, qu'une distinction est effectuée dans le choix des bibliothèques dépendantes selon le mode de compilation choisi, tu te trouvera vraisemblablement confronté à cette nécessité de devoir créer une dll "release" et une "debug" (l'inverse étant tout aussi envisageable, bien sur )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Donc si j'ai bien compris ce serait mon cas étant donné que j'utilise justement un code different en fonction de la macro "_DEBUG" ? Le mystere est-il résolu ou alors j'ai rien compris...
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    A vrai dire, tout dépend de ce qui sera déclaré en mode "debug" et de ce qui le sera en mode "release"...

    Si, pour une raison qui ne tient qu'à toi, tu as une fonction qui n'est déclarée que sur un #ifdef DEBUG ou similaire, appelée depuis l'application, mais qui n'existe purement et simplement pas en mode release, tu tiens effectivement la raison qui fait que... et donc la résolution du mystère.

    Si, par contre, la gestion "debug" vs "release" se fait tout à fait en interne (à la dll), il n'y a normalement aucune raison pour ne pas pouvoir utiliser la version "debug" dans une application en "release" ou l'inverse.

    Dans ce cas, la seule différence notable serait que:
    • dans le premier cas, tu dispose au sein de la dll d'informations de debuggage inutilisées (avec tout ce que cela implique en terme de taille et de performance de la dll)
    • dans le deuxieme, que tu ne puisse pas utiliser les informations de débuggage de la dll
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Oui c'est bien mon cas, j'ai en effet une fonction déclarée seulement en mode Debug donc je suppose que le probleme vient de la... Merci beaucoup pour m'avoir éclairé Le probleme est donc résolu.
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'ajoute aux conseils de mes illustres pairs que l'un des très gros points noirs lorsqu'on croise une appli Debug avec une DLL non-debug (et vice versa), c'est l'allocateur de mémoire. Ils sont tout simplement différents en debug et release, et l'un ne peut pas travailler avec les blocs mémoire de l'autre.

    Regarde comment fonctionnent les DLL de Windows, User32.dll, Gdi32.dll et Kernel32.dll, qui sont liées à presque toutes les applis, debug comme release. L'astuce, c'est que tout objet alloué dans le code de ces DLL y est également désalloué. C'est pour cela que tu reçois des HWND et des HPEN et des HANDLE à tout va plutôt que des pointeurs que tu peux free()-er ou delete-er. Chaque handle que tu reçois d'une DLL doit lui être rendu. Ainsi, c'est le même allocateur qui s'en occupe.

    Si maintenant du as une DLL avec une fonction qui crée et renvoie un objet, et que tu delete cet objet dans ton appli, si les allocateurs sont différents, Toto va désallouer un objet géré par Gus, et c'est la fin des haricots.

    Carl

  12. #12
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Merci pour ton conseil Carl, en fait c'est un peu particulier puisque je construit un manager de memoire en suivant le fameux tutoriel de laurent gomila sur la conception d'un moteur3D donc je desalloue seulement si Gus a oublier de le faire et seulement en mode Debug... J'ai bien créé deux librairies statiques et dynamiques différentes donc je ne devrait plus avoir de problème. Encore merci à vous pour m'avoir éclairé.
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  13. #13
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Petite mis à jour en espérant que cela pourrait pourra aider à d'autres... J'ai eu l'occasion d'approfondir un peu plus la question et au final j'étais à coté de la plaque...
    La gestion des pointeurs était à priori très bien séparés entre mon application et ma dll... mais seulement a priori! En fait le problème venait des fonctions inlines qui allouaient des pointeurs gérés par ma dll... c'est tout bête mais il fallait y penser
    Encore merci pour m'avoir aidé à comprendre comment tout cela fonctionnait
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

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

Discussions similaires

  1. difference entre mode debug et release
    Par haykelFST dans le forum C++
    Réponses: 5
    Dernier message: 23/06/2011, 09h10
  2. Réponses: 7
    Dernier message: 07/03/2009, 11h09
  3. DLL mode debug ou release
    Par squale69 dans le forum Visual C++
    Réponses: 4
    Dernier message: 09/05/2008, 00h10
  4. Savoir le mode : debug ou release
    Par BruceBoc dans le forum C++
    Réponses: 8
    Dernier message: 24/04/2007, 00h09
  5. Difference Mode debug et release
    Par balabi dans le forum MFC
    Réponses: 3
    Dernier message: 16/06/2005, 11h30

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