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

Code::Blocks Discussion :

compilation d'une appli qui comprend plusieurs projets


Sujet :

Code::Blocks

  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 compilation d'une appli qui comprend plusieurs projets
    Bonjour tout le monde,

    je suis sous linux (ubuntu), et j'essaie de compiler un programme qui est composé de:
    - 4 projets de type lib statiques (qui me génèrent donc des .a)
    - un projet "principal" tout simple avec un main, qui utilise les 4 autres libs.

    A la base, il y a un Makefile, et lorsaue je lance ce makefile avec la console, tout compile nickel.
    Je suis donc en train d'essayer de compiler ça sous C::B. J'ai créé 5 projets dans mon workspace (4 de type lib statiques, et un de type console applicatin). Je suis parvenu à compiler mes 4 libs sans trop de problèmes.
    Mais par contre, je bloque sur le projet "principal". Je ne comprend pas ce qu'il se passe, ça ne compile pas. J'obtiens un:
    "undefined reference to xxx" pour chaque classe et fonction définies dans les autres projets.
    Pourtant, j'ai bien configuré le bouzin... enfin, sans doute que non puisque ça ne compile pas. Mais j'ai bien linké avec les .a, j'ai ajouté les dossiers "include".

    Que pourrais-je avoir oublié?
    « 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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

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

    Je peux me tromper lourdement, mais...

    Normalement, dans Project->properties->(onglet "project settings, cliquer sur)->project dependancies, tu peux signaler que ton projet dépend des quatre bibliothèques...

    Il faudra après, sans doute, ajouter les dossiers d'inclusions et ceux où se trouvent les bibliothèques nouvellement créées dans Project->Build Options-> Search Directories

    [EDIT]Vérification faite, c'est bien ce qu'il faut faire...

    Les précisons à donner dans Project->build Options sont:
    • les dossier d'inclusions (Search directories->compiler)
    • les dossier des bibliothèque(Search directories->linker)
    • les bibliothèques avec lesquels effectuer la liaison (Linker Settings->link libraries)

    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
    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
    Merci Koala

    Et désolé de répondre si tard, j'avais d'autres priorités (ce n'est malheureusement pas moi qui choisi, car si ça ne tenais qu'à moi, j'en aurais fini une bonne fois pour toutes avec cette compilation sous C::B).

    Donc, j'ai bien fais ce que tu m'as dis, mais ça ne fonctionne toujours pas. Du coup, j'ai 2 questions

    1/ Dans les options du projet, on peut choisir les dépendences. A quoi ça sert ça? Est-ce que c'est comme sous ms visual, c'est à dire que ça sert juste à dire que si je compile mon projet, il faut que les projets dont il dépend soient compilés (et donc il va compiler les dépendences si ce n'est pas déjà fait) ?

    2/ Aprés avoir bien rajouté tout ce qu'il fallait dans les "search dir" et "linker settings", il m'arrive quelque chose d'étrange sur mon projet:
    Mes 4 dépendences se compilent bien, mais lorsque je compile le projet principal, il essaie de me recompiler des fichiers contenus dans projets dépendents! ^^ Enfin, je ne sais pas trop ce qu'il essaie de faire, mais je me retrouve avec des erreurs sur des fichiers contenus dans les dépendances alors que celles-ci compilent bien. Comment est-ce possible?

    Voici le début de l'output de la compilation (j'ai changé les noms des classes et fichiers, car c'est top secret ) :
    Citation Envoyé par C::B
    ../A/libA.a(GetSimpleRequest.o):: In function `Send(UnObjet*)':
    /UnFichier.cpp:95: undefined reference to `UneFontion(unsigned char)'
    ../A/libA.a(UnFichier.o):: In function `UneAutreFonction(UnParametre*)':
    /UnFichier.cpp:145: undefined reference to `UneFonction(unsigned char
    //etc..
    Je précise que ce projet compile sous ms visual 8 express, ms visual 7, ms visual 2005, et avec le makefile sous gcc 4.1 (compilo qui est utilisé par mon C::B)
    « 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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Donc, chaque projet qui est nécessaire à un autre doit être capable de se compiler de manière autonome.

    Tu dois donc veiller à ce que les différents dossiers d'inclusion et de bibliothèques soient correctement définis dans les option du projet "requis"

    Quand tu as plusieurs projets ouverts sur ton espace de travail, tu peux indiquer que le projet A a besoin du projet B pour se compiler.

    Dés lors, quand tu demandera la compilation du projet A, il vérifiera s'il ne doit pas, à "tout hasard" recompiler le projet B (des fois que tu y aurais apporté des modifications), et ne le fera que si c'est nécessaire (ou si tu le demande explicitement avec "Rebuild" (<ctrl>+<F11>) )

    Il est bien entendu que la compilation du projet B doit fournir une bibliothèque hein

    Sois bien attentif à l'endroit où va aller se "loger" la bibliothèque créée pour le projet B, et à son nom (tu peux, si tu le désire, fournir un nom pour la lib "debug" et un nom pour la lib "release" ), et que tu dois bel et bien indiquer au projet A le .a .lib ou .dll (il se fout des fichiers objet lors de l'édition de liens ) qu'il doit utiliser, ainsi que le chemin à utiliser pour le retrouver, et le chemin pour retrouver les inclusion

    Pour le reste, parce que j'ai fait les essais expressément pour toi, je n'ai pas eu de problème une fois que j'avais correctement indiqué les différents dossiers...
    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
    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
    Merci beaucoup koala

    Mais je n'y arrive pas...
    Pfff... je ne comprend pas... j'ai l'impression que c'est un bug de C::B. C'est possible?

    Ce que j'ai fais, pour tester, je suis reparti de 0:
    j'ai créé un workspace vide,
    j'y ai ajouté un projet A, de type static lib.
    Le projet A contient une classe A avec une fonction f(){cout<<"hello"<<endl;}
    A est compilé dans le fichier de sortie libA.a

    j'y ai ajouté un projet Test, de type console,
    Dans le projet Test, j'ai juste rajouté, dnas build settings
    -> link library: libA.a
    -> search dir -> compiler: le dossier dans lequel il y a A.h
    -> search dir -> linker: le dossier dans lequel il y a libA.a

    libA compile impec, mais Test, qui ne comprend qu'un main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "A.h"
     
    int main()
    {
        A a;
        return 0;
    }
    ne compile pas:
    /home/rodrigue/dev/Tests/Test1/Test1/.objs/main.o:: In function `main':
    /home/rodrigue/dev/Tests/Test1/Test1/main.cpp:5: undefined reference to `A::A()'
    :: === Build finished: 1 errors, 0 warnings ===
    J'ai décris là exactement ce que j'ai fais, sans rien omettre. Par exemple, je n'ai pas fais les dépendences (mais si je les fais ça ne change rien). Ais-je oublié quelque chose?
    « 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

  6. #6
    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
    Stoooop!
    Oubliez le post précédent je m'étais trompé dans un path.
    Maintenant mon projet de test fonctionne.

    Encore koala
    « 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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par r0d Voir le message
    Stoooop!
    Oubliez le post précédent je m'étais trompé dans un path.
    Maintenant mon projet de test fonctionne.
    C'est la faute de ces imbécile d'outils qui n'arrivent pas à interpréter correctement ce qu'on leur dit quand on leur dit une c
    Encore koala
    Avec plaisir
    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

  8. #8
    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
    Yopopop, bon bah finalement, le problème c'était juste que j'avais mal configuré mes liens.

    Désolé

    Encore koala
    « 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

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

Discussions similaires

  1. Réponses: 36
    Dernier message: 14/08/2008, 16h37
  2. [VBA-E]Methode pour trouver une valeur qui apparait plusieur fois
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2006, 13h11
  3. [vb6]MAJ sur une appli qui tourne 24h/24
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 25/04/2006, 22h49
  4. Réponses: 14
    Dernier message: 09/04/2004, 13h44
  5. Réponses: 2
    Dernier message: 26/08/2003, 14h21

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