Forum Programmation.c++ Interdire à GCC de charger les includes par défaut

Posté par  .
Étiquettes : aucune
1
5
jan.
2010
Bonjour,

Ma question me semble simple, mais je n'ai pas trouvé de réponse dans mon moteur de recherche préféré, alors je tente ma chance ici.

Je souhaite compiler la version CVS de la bibliothèque TotoLib dépendant de TotoBase. Je veux installer ça dans /home/moi/toto/lib et /home/moi/toto/includes.

Le hic, c'est que je ne suis pas administrateur de la machine, et qu'elle contient la version 1.0 de TotoLib et TotoBase, installés dans /usr/lib et /usr/includes.

Je peux compiler TotoBase, l'installer dans mon homedir, mais quand j'installe TotoLib, lors de l'inclusion de headers de TotoBase (genre #include ), il charge celui de la version 1.0 qui est sur le système (/usr/includes), alors que je voudrais qu'il utilise celle de mon homedir.

À noter que j'ai bien préalablement fait un petit
export CPPFLAGS=-I/home/moi/toto/includes

Rien à faire, g++ semble se servir en priorité dans /usr/includes qui contient une ancienne version, et du coup, ne peux pas compiler (error: ISO C++ forbids declaration of 'MaClasseNouvellementDefinie’ with no
type).

Est-il possible de l'obliger à n'utiliser que les headers situés dans un répertoire spécifié ?

De même pour les shared objects, mon binaire ainsi compilé va-t-il pouvoir être lié aux so locaux (de mon homedir) ?

Merci de vos lumières !
  • # Options g++

    Posté par  . Évalué à 4.

    Bonjour,

    Les options suivantes te seront surement utiles :

    -nostdinc++
    Do not search for header files in the standard directories specific to C++, but do still search the other standard directories.

    -nodefaultlibs
    Do not use the standard system libraries when linking.

    -nostdlib
    Do not use the standard system startup files or libraries when linking.

    Après, cela dépend de ton code mais la dernière option ne devrait pas être nécessaire.
    • [^] # Re: Options g++

      Posté par  . Évalué à 1.

      J'ai essayé -nostdinc++, mais avec cette option, il ne trouve plus les en-têtes de la stdlib… Il faut que je bricole encore un peu pour voir si ces options peuvent m'aider.

      Merci !
  • # doc gcc

    Posté par  . Évalué à 3.

    A priori, tu devrais trouver ton bonheur ici http://gcc.gnu.org/onlinedocs/gcc-3.1.1/gcc/Directory-Option(...)


    Concernant les headers :

    Attention sur la façon dont est faite l'inclusion des headers de TotoBase ?

    /* Sous la forme d'en tête standard */
    #include <toto.h>
    /* ou bien sous la forme d'en tête locale */
    #include "toto.h"


    En fonction de ca, tu peux utiliser les options de la ligne de commande "-I" et "-I-"

    -I: Add the directory dir to the head of the list of directories ...
    -I-: If additional directories are specified with -I options after the -I-, these directories are searched for all #include directives



    Concernant les libs :

    Ce n'est pas explicité dans le lien ci dessus, mais il semblerait que -L ajoute également les repertoires en tête de liste.
    • [^] # Re: doc gcc

      Posté par  . Évalué à 1.

      >>> Attention sur la façon dont est faite l'inclusion des headers de TotoBase ?

      Je n’ai malheureusement pas le choix : ni TotoLib ni TotoBase ne sont écrites par moi, et je ne peux pas modifier les sources qui doivent être recompilables assez rapidement après une mise à jour CVS.

      >>> -I: Add the directory dir to the head of the list of directories

      Et pourtant quand j'ajoute des répertoires d'inclusion avec -I, c'est les headers du système (/usr/include) qui sont chargés.


      J’ai beau relire, j'ai du mal à comprendre le fonctionnement du -I-.

      Dans tous les cas merci beaucoup pour l'aide, je vais potasser tout ça.
    • [^] # Re: doc gcc

      Posté par  . Évalué à 2.

      Une autre question : je ne peux pas moi-même appeler g++, je dois utiliser make.

      Est-ce que la bonne méthode est de spécifier ces options comme cela :

      export CPPFLAGS="-I/home/moi/toto/include"
      • [^] # Re: doc gcc

        Posté par  . Évalué à 4.

        Ça dépend du Makefile, mais la plupart du temps il faut définir ces variables au moment du "./configure" (par exemple "CPPFLAGS=-I... ./configure"). Il peut aussi y avoir une option --with-libtoto, à laquelle tu peux passer le prefix de la libtoto : ./configure --with-libtoto=/home/moi/toto.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.