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 :

[conception] dépendances de bibliothèques et headers


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut [conception] dépendances de bibliothèques et headers
    Bonjour tout le monde,

    j'ai un problème tout bête mais je ne parviens pas à trouver une solution élégante. C'est pourquoi je m'en remet à vous

    Soit un programme P qui utilise une bibliothèque statique L1.lib.
    La lib L1 définit une classe CL1 dans le fichier CL1.h.
    La class CL1 utilise une classe CL2 définie dans CL2.h et appartenant à la lib CL2.lib.
    Voici à quoi pourrait ressembler CL1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "CL2.h"
     
    class CL1
    {
    // des fonctions, constructeurs, destructeurs, etc.
     
    private:
        CL2  monCL2; //une instance de CL2
    };
    Le problème qui se pose ici, c'est que dans mon programme P, lorsque je vais inclure CL1.h, il va m'inclure également CL2.h.
    Or, ce que je voudrais, c'est que lorsque j'ai compilé CL1, je n'ai plus besoin du tout de CL2 pour P. Idéalement, j'aimerais que P n'ait même pas à ce soucier de l'exitence de CL2.

    Ce qui m'intrigue, c'est qu'en essayant de résoudre ce problème, on se retrouve confronté à des aberrations. Par exemple, si je modifie CL1.h ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CL2;
     
    class CL1
    {
    // des fonctions, constructeurs, destructeurs, etc.
     
    private:
        CL2*  pMonCL2; //un pointeur sur une instance de CL2
    };
    ça ne me convient pas car si j'avais déclaré CL2 en variable membre par valeur, c'est qu'il y a une raison.

    En fait donc, j'aimerais avoir quelques conseils sur la création de lib statique, afin que l'utilisation de cette lib soit la plus simple possible.


  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne pense pas que tu aies beaucoup d'alternatives, si tu veux supprimer une dépendance sur une classe il faut que tu retires l'inclusion de son en-tête, et donc que tu n'en gardes qu'un pointeur. Avec un pointeur intelligent tu es quitte de définir constructeurs et destructeurs pour ta classe.

    Par contre si L1.lib et L2.lib sont des bibliothèques statiques, même si L1 ne fait plus référence à L2 dans ses en-têtes, il faudra tout de même que P lie avec L2.lib.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par Laurent Gomila
    Par contre si L1.lib et L2.lib sont des bibliothèques statiques, même si L1 ne fait plus référence à L2 dans ses en-têtes, il faudra tout de même que P lie avec L2.lib.
    Pas nécessairement : sous msvc on peut aller dans les options du 'Librarian' de L1 et ajouter L2.lib dans 'Additional Dependencies'.

    On peut aussi se débrouiller avec gcc en faisant quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ar xv libL2.a | cut -f3 -d ' ' | xargs ar rvs libL1.a
    Dans les deux cas l'effet est que P ne verra plus que L1.
    Même si c'est pas forcément conseillé, il y a moyen en tous cas...

    MAT.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pas nécessairement : sous msvc on peut aller dans les options du 'Librarian' de L1 et ajouter L2.lib dans 'Additional Dependencies'.
    Visual Studio propose en effet un certain nombre de raccourcis, mais je crois que tous finissent par lier, automatiquement ou non, avec la bibliothèque. Il n'y a pas moyen d'intégrer le code compilé de L2 dans L1.

    Pour ce qui est de la manip Linux, je n'ai aucune idée de ce qu'elle fait.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il n'y a pas moyen d'intégrer le code compilé de L2 dans L1.
    Pourtant c'est ce que ça fait : tu peux distribuer L1.lib tout seul.

    Citation Envoyé par Laurent Gomila
    Pour ce qui est de la manip Linux, je n'ai aucune idée de ce qu'elle fait.
    Ca extrait les .o de libL2.a et ça les rajoute dans libL1.a.

    Non mais bon c'était anecdotique...

    MAT.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En effet

    C'est bon à savoir, merci.

  7. #7
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,

    par rapport au problème de supprimer l'inclusion de CL2.h pour les utilisateurs de la lib
    Citation Envoyé par r0d
    Le problème qui se pose ici, c'est que dans mon programme P, lorsque je vais inclure CL1.h, il va m'inclure également CL2.h.
    Or, ce que je voudrais, c'est que lorsque j'ai compilé CL1, je n'ai plus besoin du tout de CL2 pour P. Idéalement, j'aimerais que P n'ait même pas à ce soucier de l'exitence de CL2.
    Je ne crois pas qu'il y ait de solution "élégante". Pour utiliser CL1, par exemple faire un tableau de 10 CL1, le compilateur aura besoin de connaître la taille de CL1 et donc celle de CL2, que seul CL2.h peut lui fournir.

    Pour un pointeur vers une classe, il n'y a pas ce problème (quelque soit CL2, sont pointeur à une taille fixe).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CL2;
     
    class CL1
    {
    // des fonctions, constructeurs, destructeurs, etc.
     
    private:
        CL2*  pMonCL2; //un pointeur sur une instance de CL2
    };
    C'est pour cela que ce code pourrait passer, mais ce n'est pas ce que tu veux ...

Discussions similaires

  1. Conception d'une bibliothèque graphique
    Par salma_tn dans le forum UML
    Réponses: 1
    Dernier message: 22/03/2010, 11h49
  2. conception d'un bibliothèques électroniques
    Par saiad87alg dans le forum UML
    Réponses: 2
    Dernier message: 19/03/2010, 20h50
  3. Dépendances de projets et problème de conception
    Par Captain_JS dans le forum C++
    Réponses: 8
    Dernier message: 02/09/2008, 00h17
  4. conception : table des dépendances
    Par gregolak dans le forum Langage SQL
    Réponses: 12
    Dernier message: 09/10/2005, 16h10
  5. [Concept] Dépendances fonctionnelles
    Par bolo dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 24/01/2003, 20h13

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