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

Langage C++ Discussion :

Question à propos de bibliothèque statique dans une bibliothèque dynamique


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut Question à propos de bibliothèque statique dans une bibliothèque dynamique
    Bonjour à tous,

    Je viens vers vous pour une question concernant l'inclusion de static lib dans une dynamic lib, je précise que je bosse sur windows7, avec codeblocks et TDM GCC 4.8.1/mingw.

    Voila, je travail sur 2 projets, l'un qui est un projet de bibliothèque et l'autre qui utilisera la dite bibliothèque.

    Le projet de la bibliothèque en lui même nécessite l'inclusion de biblio externe sous format static, jusqu’à la, aucun problème, j'arrive au résultat voulu et à générer ma .dll/.a
    Pour inclure ma static lib dans ma .dll, dans le "linker settings" des options de compilation de mon projet, j'ajoute dans le cadre "Other Linker Options" ceci ( en espérant que c'est bien ça qu'il fallait faire ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    -Wl,--whole-archive
    monChemin/lib1.a
    monChemin/lib2.a
    -Wl,--no-whole-archive

    En revanche, la ou je bloque, c'est pour utiliser la dite bibliothèque dans l'autre projet. Je configure donc mon projet, lui donne le chemin du linker de ma .dll et récupère le fichier header de la dite .dll pour l'utiliser dans le projet.
    Le problème c'est lorsque je passe à la phase de compilation, j'ai un jolie petit message d'erreur de ce style :

    error: chemin/leHeaderDeMaDll.hpp: No such file or directory ( erreur qui provient du header de la .dll utilisait dans le projet principal )

    Le message est clair, pour le compilo, le chemin du fichier inclus dans le header n'est pas bon ( la fameuse static lib que j'ai voulu lié/compilé directement dans ma dll ), ce qui est normal puisque le projet principal n'est pas configuré pour aller chercher de lui même ce qu'a besoin la .dll pour fonctionner puisque normalement, sa devrait être géré directement dans le projet de la bibliothèque.

    Ma question est donc :

    Que dois-je faire pour résoudre ce problème ? je souhaite que ce qui est géré dans la .dll, le reste, à comprendre, si il y a des bibliothèques static utilisaient dans la .dll, que celle-ci soit directement compilé dedans avec les bon chemins et compagnie et qu'une fois que je l'utilise dans mon projet principal, je n'ai plus à me soucier des différents liens qu'a besoin le projet bibliothèque dynamique.

    Ou alors, ce n'est pas possible et je dois aussi configurer mon projet principal pour utiliser la lib static dans ma .dll ou importer le header de la lib static utilisait dans la .dll ?

    Merci par avance pour votre aide.

    Karl

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Ici, le problème ne semble pas être spécifiquement un problème de bibliothèques statique/dynamique, mais un problème de gestion des projets et des fichiers d'en-tête.

    Pourquoi ne pas simplement ajouter le chemin du répertoire en paramètre du compilo? (-I chemin) (i majuscule)
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut
    Oui effectivement, je n'avais pas envisagé cette solution mais du coup, je suis obligé dans mon main project de lui donner tous les fichiers .a and co de la lib static qui est normalement dans la dll ( tous les liens/linker et autre que j'ai du configuré pour le projet de la dll, je dois le reconfigurer quasi à l'identique pour le main project ). Il n'y a aucun moyen de faire autrement ? A comprendre, que dans le main project, je lui donne le header de la .dll + le linker de la .dll ( .a ) mais que je n'ai pas à reconfigurer tous les chemins pour retrouver la lib static compilait et utilisait dans la .dll. ( Que ma dll soit indépendante et embarque déjà tout ce qu'elle a besoin pour fonctionner ).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Normalement, le programme principal n'est pas censé avoir besoin du header des libs statiques, à moins que la DLL expose directement des fonctions de celle-ci (déconseillé).

    Mais le message d'erreur que tu me montrais était une erreur liée au header de la DLL, pas à celui d'une des libs statiques.
    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 averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut
    Oui oui, je suis bien d'accord avec toi, je n'ai pas dit le contraire. le message d'erreur vient du header de la .dll qui inclue le header de la lib statitc que j'utilise. ( C'est pour ça que je demandais comment pouvoir gérer ça ).

    Par contre quand tu dis ça :

    à moins que la DLL expose directement des fonctions de celle-ci (déconseillé).
    J'avoue que ce passage m'est un peu obscure, qu'entends-tu par exposé directement des fonctions ? Je veux dire si tu appels une biblio, c'est pour l'utiliser, tu devras forcément appeler des fonctions lui étant propre à un moment ou un autre.

    Donc n'ayant pas comprit la subtilité de ta phrase, pourrais-tu éclaircir ma lanterne si ce n'est pas trop demandé ?

    Merci par avance.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Imagine que tu as LibA qui contient une fonction A(), LibB qui contient une fonction B(), Dll qui contient une fonction D() qui appelle A() et B().

    Si Dll expose seulement D(), c'est bon. Si Dll expose aussi A() et B(), c'est moins bon car là tu auras besoin du header de LibA et LibB dans ton programme.
    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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/01/2015, 11h44
  2. Réponses: 0
    Dernier message: 16/07/2010, 14h05
  3. Problème de lien avec une bibliothèque statique
    Par streetpc dans le forum C++/CLI
    Réponses: 2
    Dernier message: 28/10/2006, 18h38
  4. Réponses: 11
    Dernier message: 12/08/2006, 11h22
  5. Utiliser une bibliothèque statique
    Par djflex68 dans le forum MFC
    Réponses: 6
    Dernier message: 15/08/2005, 20h26

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