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

Visual C++ Discussion :

Librairie, DLL et mode Release


Sujet :

Visual C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Librairie, DLL et mode Release
    J'ai téléchargé une libraire qui s'appelle clucene (version du 12/11/2009). C'est un portage en C++ d'une librairie java permettant de faire des recherches plein texte.

    Elle est fournie sous forme de code source uniquement. Il faut utiliser un outil appelé cmake pour générer le code nécessaire pour la plateforme et le compilateur cibles.
    Il faut aussi se procurer par ailleurs zlib1.dll.

    J'ai réussi vaille que vaille à générer et compiler le tout pour Visual 2005.
    En mode debug je n'ai pas eu trop de mal.
    En mode release ça s'est corsé, NDEBUG et _DEBUG étant définis simultanément dans les directives du preprocesseur ().

    Bref, après correction j'ai réussi à compiler les programmes de test. A l'exécution en mode debug ça fonctionne, en mode release ça plante.
    J'ai créé un petit projet utilisant la bibliothèque précompilée, même problème: ok en debug, pas ok en release.

    Dans les deux cas, la librairie est compilée sous forme de DLL (il y en a 2) et utilise le CRT aussi en mode DLL. J'ai donc fait un essai en recompilant le tout sous forme de librairie statique.
    Et là, miracle, ça fonctionne dans tous les cas.

    Y'a-t-il des cas d'école classiques où les DLL en release plante ?
    Intuitivement, en essayant de débugger le code release (il semble qu'il suffit d'ajouter la génération des infos debug lors de la compil) j'ai l'impression que les objets globaux statics ne sont pas initialisés dans la DLL? Serait-ce possible ?
    Merci.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Bon, et bien j'ai trouvé.
    Si ça marche en debug et en static c'est par "hazard".

    En fait il y a de nombreux objets dans le segment de données dont certains dépendent d'autres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static type1 var1;
    static type2 *ptrvar2=new type2(var1);//type1 is used by type2 !!!
    En gros, il faut prier pour que l'ordre de création ci-avant soit le bon.

    Comment gérer ce genre de problème ?

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    Comment gérer ce genre de problème ?
    En programmant proprement (et tu te doutes bien que ce n'est pas toi que je vise... ). Manifestement, le portage depuis Java a été fait ... un peu sauvagement, on va dire.

    Laisse les déclaration globales à leur place, mais déplace les initialisations dans une fonction dédiée (ex : "CLuceneInitialize()"), que tu appelleras depuis ton main().

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    J'ai pris mon courage à deux mains et c'est ce que j'ai fait.

    Il existe une fonction _lucene_shutdown() mais pas d'équivalent pour initializer. J'en ai créé une baptisée _lucene_warmup() et j'y ai déplacé tous les type *var = new type; en type *var = NULL; ... void _warmup() {var=new type; ...}
    Et ça a l'air de bien fonctionner.
    Mais mes tests sont en monotâche, monoprogramme, monothread... Je crains que le pire est à venir... enfin on verra
    Je pense aussi que je vais devoir utiliser la version dll et non pas compiler le tout en statique car il y a une fonction DllMain() qui fait une action sous DLL_THREAD_DETACH. Il y a un commentaire suggérant que DllMain doit être changé au profit d'une fonction appelable par l'utilisateur.

    A propos de DLL, 2 questions:
    -Peut-il ne pas y avoir de fonction DllMain() dans une DLL ? Le projet contient 2 DLL mais une seule possède cette fonction.
    -Dans les projet DLL de la solution, je constate que le .LIB correspondant n'est pas toujours généré (si je me fie aux dates de fichiers). Est-ce normal ?
    Merci.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    -Peut-il ne pas y avoir de fonction DllMain() dans une DLL ? Le projet contient 2 DLL mais une seule possède cette fonction.
    MSDN dit que DllMain est "An optional entry point into a dynamic-link library (DLL)". Donc, oui, même si je trouve ça assez stupide si l'on implémente une DLL censée être compatible MT.

    Citation Envoyé par camboui Voir le message
    -Dans les projet DLL de la solution, je constate que le .LIB correspondant n'est pas toujours généré (si je me fie aux dates de fichiers). Est-ce normal ?
    Je pense que c'est possible si l'on active "Activation de la régénération minimale" dans les options de compilation (C/C++ -> Génération de code), et/ou "Activation des liens incrémentiels" sur le linker (Édition de liens -> Général).

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    OK, merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/04/2010, 18h55
  2. Réponses: 7
    Dernier message: 07/03/2009, 11h09
  3. Dll en mode debug et release
    Par babar63 dans le forum C++
    Réponses: 12
    Dernier message: 18/02/2008, 20h27
  4. dll en mode release
    Par foulla002 dans le forum Visual C++
    Réponses: 1
    Dernier message: 25/07/2006, 15h06

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