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 :

Librairie statique et Préprocesseur


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2006
    Messages : 105
    Points : 109
    Points
    109
    Par défaut Librairie statique et Préprocesseur
    Bonjour,

    je travaille sur deux projets qui ont une grande partie semblable, cette partie devrais être grouper dans une librairie statique (.lib) le problème c'est que j'ai fusionné les parties du code en ajoutant des #ifdef pour sélectionner dans chaque section différente le code correspondant au projet qui est en cour de compilation. je me suis trouvé, alors avec des problèmes pour compiler ma librairie statique vue que je n'est pas défini les valeurs préprocesseur.

    ma question est comment pourrais je compiler cette librairie avec tous les scenarii possible pour en choisir un lors de la compilation du projet.

    bon je donne un petit exemple pour comprendre car c'est facile à assimiler avec l'exemple.

    supposant que j'ai deux projet qui calcule le premier a+b et le deuxième a-b et ce en choisissant l'opérateur
    dans la librairie je voudrai mettre ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef PRJ1_COMPILATION
    operator = '+';
    #else
    #ifdef PRJ2_COMPILATION
    operator = '-';
    #endif
    #endif
    switch (operator)
    {
    case '+': return a+b;
    case '-': return a-b;
    }
    je voudrais maintenant sans définir ni PRJ1_COMPILATION ni PRJ2_COMPILATION compiler ma .lib et le choix devrais etre fait à la compilation des projets ?

    Merci

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

    Informations professionnelles :
    Activité : aucun

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

    Il y aurait sans doute bien plus facile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int function(int a, int b)
    {
    #if defined (PRJ1_COMPILATION)
        return a+b;
    #elif defined (PRJ2_COMPILATION)
        return a-b
    #endif
    }
    A utiliser tout simplement sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo(/*...*/)
    {
        /*...*/
        int result = function(3,5);
    }
    Mais il y a un problème si tu envisage de créer une bibliothèque, car tu devrais alors envisager de la compiler avec les deux symboles, ce qui n'est sans doute pas la meilleure solution

    Tu peux donc envisager une autre approche: celle de créer réellement deux fonctions, et de choisir celle qui correspond grâce aux symboles préprocesseurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int function_prj1(int a, int b)
    {
        return a +b;
    }
    int function_prj2(int a, int b)
    {
        return a-b;
    }
    #if defined (PRJ1_COMPILATION)
    #define function(x, y) function_prj1(x,y)
    #elif defined (PRJ2_COMPILATION)
    #define function(x, y) function_prj2(x,y)
    #endif
    qui sera, simplement, utilisé sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo()
    {
        /*...*/
        int result=function(5,9);
    }
    De cette manière, le code binaire des deux fonctions sera réellement disponible dans la bibliothèque, et tu pourra donc te contenter de ne la compiler qu'une seule fois
    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
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2006
    Messages : 105
    Points : 109
    Points
    109
    Par défaut
    Mais il y a un problème si tu envisage de créer une bibliothèque, car tu devrais alors envisager de la compiler avec les deux symboles, ce qui n'est sans doute pas la meilleure solution
    est ce possible ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Ben, oui, pourquoi pas ...

    Il "suffit" de définir le symbole correspondant lorsque tu compile la bibliothèque

    La seule chose, c'est qu'il faudra alors que les deux versions différentes soient nommées de manière différentes, et donc, fatalement, veiller à ce que le programme soit lié avec... la version portant le bon nom, autrement, tu risque d'avoir des résultats aberrants (un calcul où tu effectue une addition au lieu d'une soustraction, ca change énormément le résultat )

    De plus, il faut quand même se rendre compte que cela demande donc deux fois plus de temps pour créer les deux versions de la bibliothèque

    C'est pourquoi, je te conseille plutôt la deuxième solution proposée (une bibliothèque présentant les deux fonctions, sélection de celle qui convient grâce aux symboles préprocessuer)
    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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Je me suis peut être mal exprimé avec mon "car tu devrais alors envisager de la compiler avec les deux symboles"...

    Ce que je voulais dire, c'est que tu devrais donc envisager de compiler deux fois la bibliothèque:
    1. une fois en définissant PRJ1_COMPILATION
    2. une fois en définissant PRJ2_COMPILATION
    avec, comme résultat, que tu *risque* de te retrouver avec deux versions différentes (ce qui est effectivement fait est différent ) portant le même nom pour la bibliothèque, et donc de devoir trouver le moyen de les faire cohabiter (en les plaçant, par exemple, dans des dossiers différents, ou, comme je viens de le dire, en les nommant différemment).

    Mais, même si tu évite ce premier écueil, il restera le problème des résultats aberrants si tu n'est pas suffisamment attentif à ce que tu fais lors de l'édition de liens

    Tu comprend donc maintenant surement beaucoup mieux pourquoi la seconde solution s'avère très largement meilleure
    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

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2006
    Messages : 105
    Points : 109
    Points
    109
    Par défaut
    Merci infiniment Philippe

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

Discussions similaires

  1. librairie statique
    Par Mokhtar BEN MESSAOUD dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 28/01/2006, 23h00
  2. [C++]Créer des librairies statiques
    Par aiolia_aiolos dans le forum MFC
    Réponses: 3
    Dernier message: 04/01/2006, 12h05
  3. Réponses: 5
    Dernier message: 22/12/2005, 17h31
  4. Réponses: 2
    Dernier message: 19/08/2005, 16h02
  5. librairie statique/dynamique
    Par trop_wizz dans le forum MFC
    Réponses: 4
    Dernier message: 11/04/2005, 10h04

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