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 :

bibliothèque et include


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut bibliothèque et include
    Bonjour à tous,

    j'ai une question à laquelle je n'ai jamais trouvé de réponse et qui me taraude toujours. Ou bien j'ai oublié. Ou ils sentaient pas bon. Enfin ils veulent pas :]

    Alors on est sous Windows, avec visual studio (peu importe la version).
    On a une solution avec 2 projets.
    Le premier projet est une bibliothèque statique. Cette bibliothèque utilise une bibliotèque externe, par exemple boost.
    Le deuxième projet est un exécutable qui utilise la bibliothèque du premier projet.

    Un des en-tête de la lib du premier projet inclus un en-tête de boost. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // fichier UneClasseDeLaLib.h
     
    #ifndef UNECLASSEDELALIB_H
    #define UNECLASSEDELALIB_H
     
    #include <boost/date_time/posix_time/posix_time.hpp>
     
    class UneClasseDeLaLib
    {
    //etc.
    et dans le projet exécutable, quelque part on a un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "UneClasseDeLaLib.h"
    L'exécutable du 2eme projet n'est pas sensé connaitre boost lui. Lui en s'en fiche de boost, il n'en a pas besoin directement. Donc il ne link pas boost ni n'est configuré pour savoir où sont les .h de boost.

    Mais ça ne marche pas. A la compilation de l'exécutable, le compilateur me donne une erreur disant qu'il ne trouve pas le fichier boost/date_time/posix_time/posix_time.hpp

    Comment faire pour éviter d'avoir à configurer le projet de l'exécutable pour boost?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Salut Rod,

    J'ai du rater quelque chose dans ta question, parce que j'ai l'impression que la réponse est dans la question ?

    Soit tu veux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class UneClasseDeLaLib
    {
    public :
    	void m(const boost::time& ...);
    ...
    }
    et ce n'est pas possible de ne pas fournir la définition de time à l'utilisateur, puisqu'il en a besoin.

    Soit tu veux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class UneClasseDeLaLib
    {
    private :
    	void m(const boost::time& ...);
    ...
    }
    et à ce moment-là tu dois inclure la partie publique de tes classes dans la lib, ce qui reste (à ma connaissance) quelque chose de spécifique à tel ou tel compilateur.

    Un post précédent parle de ceci et Flo semble avoir mis ça en place.

    Bonne journée

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 71
    Points
    71
    Par défaut
    Tu peux déplacer les includes de boost dans les fichiers d'implémentation de la bibliothèque et:
    - mettre des déclarations anticipées à la place, si les éléments de boost sont utilisé uniquement sous forme de pointeur, de référence ou de paramètres de fonctions,
    - ou cacher tous les éléments de boost derrière un seul pointeur vers une structure opaque également déclarée de façon anticipée (idiome pimpl/d-pointer/cheschire cat).

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    @feriaman: en fait mon problème est lorsque la variable est membre de la classe de la lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class UneClasseDeLaLib
    {
    private :
    	boost::time m_time;
    @alexisdm: effectivement, le cheshire cat... mais je trouve que c'est un peu lourd, surtout lorsque la classe en question est une petite structure, mais bon, je ne crois pas qu'il y a d'autre moyen.

    Ce type de problème est inhérent au dev de bibliothèque. C'est un bon exemple qui montre que le dev de bibliothèque est très différent du dev d'application, même au niveau technique.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par r0d Voir le message
    @feriaman: en fait mon problème est lorsque la variable est membre de la classe de la lib:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class UneClasseDeLaLib
    {
    private :
    	boost::time m_time;
    .
    Ok. Le seul point important de mon point de vue, c'est public ou privé.
    • public => impossible
    • privé => il ne faut exporter que la partie publique.


    Partant de là, on peut se demander comment faire.
    Le fait de séparer à la main public/privé est une solution.
    Peut-être que certains compilateurs permettent de n'exporter la partie privée en déclarant spécifiquement que tu n'exporte pas ceci ou cela.

    Encore une fois, l'export de classes en C++, c'est pas au point, et certainement pas portable.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par r0d Voir le message
    ....
    2 solutions (avec des tas de fenêtres avec presque pas de murs) :
    => Ou boost fait parti de l'interface publique de ta bibliothèque et alors boost est une dépendance apportée par ta bibliothèque à ton programme
    => ou boost fait parti de l'implémentation privée de ta bibliothèque, et là : pimpl idiom pour n'avoir qu'une interface de fonctions publiques uniquement.

Discussions similaires

  1. #include, bibliothèques et modules
    Par VivienD dans le forum Débuter
    Réponses: 3
    Dernier message: 19/11/2012, 01h03
  2. Includes et bibliothèques
    Par Yihaa dans le forum Qt Creator
    Réponses: 7
    Dernier message: 14/08/2009, 16h09
  3. include de bibliothèque ITK
    Par duvi87 dans le forum VC++ .NET
    Réponses: 0
    Dernier message: 11/12/2008, 14h24
  4. #include "math.h" et #include <math.h>
    Par pounka dans le forum C
    Réponses: 4
    Dernier message: 01/05/2003, 21h06
  5. Bibliothèques et documentation
    Par Anonymous dans le forum OpenGL
    Réponses: 4
    Dernier message: 01/04/2002, 12h24

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