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

Autres éditeurs Discussion :

g++: compiler en incluant des classes perso


Sujet :

Autres éditeurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut g++: compiler en incluant des classes perso
    Hello,

    Passant d'Eclipse à g++ (marre de ce gui qui plante 12 fois apr jour... Vive la ligne de commande...), je me retrouve enquiquiner à ne pas réussir à recomplier mon programme.

    Celui-ci utilise 2 class et 1 définition de structure externe. Comment je dois m'y prendre pour compiler tout ca?

    Mon fichier principal (me sert a effectuer des tests, avant tout... C'est surtout pour le principe...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
    using namespace std;
     
    #include "../include/Communication.h"
    #include "../include/structure.cpp"
    #include "../include/Log.h"
     
    int main() {
            msg test1, test2, test3, test4;
     
            test1.cmd_id = 5;
            test1.lenght = 5;
            test1.urgent = true;
     
            test2.cmd_id = 22;
            test2.lenght = 12;
            test2.urgent = true;
     
            Communication arm_com;
     
            arm_com.send_message ( &test1 );
            arm_com.send_message ( &test2 );
     
     
            arm_com.get_msg(&test3);
            printf("%i", test3.cmd_id);
            arm_com.get_msg(&test4);
            printf("%i", test4.cmd_id);
     
            Log::write_log("Common", 1, "Test");
     
            return 0;
    }
    Le contenu de mon répertoire include:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Communication.cpp  
    Communication.h  
    Communication.o  
    Log.cpp  
    Log.h  
    Log.o  
    Queue.cpp  
    Queue.h    
    Queue.o  
    define.h  
    structure.h
    J'ai bien créer mes .o, mais j'ai du le faire à partir des .cpp, donc à priori ca doit etre fait? Dois-je réellement travailler de cette facon?

    Qu'est-ce que je fais de faux?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    g++ -o common common.cpp ../include/Communication.o ../include/structure.o ../include/Log.o
    ../include/Communication.o: In function `Communication::send_message(msg*)':
    Communication.cpp:(.text+0x98): undefined reference to `Queue::send_msg(msg*)'
    Communication.cpp:(.text+0xb7): undefined reference to `Queue::send_msg(msg*)'
    ../include/Communication.o: In function `Communication::get_msg(msg*)':
    Communication.cpp:(.text+0x1cd): undefined reference to `Queue::get_nbr_msg()'
    Communication.cpp:(.text+0x218): undefined reference to `Queue::get_msg(msg*)'
    Communication.cpp:(.text+0x22c): undefined reference to `Queue::get_nbr_msg()'
    Communication.cpp:(.text+0x24a): undefined reference to `Queue::get_msg(msg*)'
    ../include/Communication.o: In function `Communication::~Communication()':
    Communication.cpp:(.text+0x281): undefined reference to `Queue::~Queue()'
    Communication.cpp:(.text+0x295): undefined reference to `Queue::~Queue()'
    Communication.cpp:(.text+0x2bc): undefined reference to `Queue::~Queue()'
    ../include/Communication.o: In function `Communication::~Communication()':
    Communication.cpp:(.text+0x2ff): undefined reference to `Queue::~Queue()'
    Communication.cpp:(.text+0x313): undefined reference to `Queue::~Queue()'
    ../include/Communication.o:Communication.cpp:(.text+0x33a): more undefined references to `Queue::~Queue()' follow
    ../include/Communication.o: In function `Communication::Communication()':
    Communication.cpp:(.text+0x3f9): undefined reference to `Queue::Queue()'
    Communication.cpp:(.text+0x409): undefined reference to `Queue::Queue()'
    Communication.cpp:(.text+0x421): undefined reference to `Queue::~Queue()'
    ../include/Communication.o: In function `Communication::Communication()':
    Communication.cpp:(.text+0x457): undefined reference to `Queue::Queue()'
    Communication.cpp:(.text+0x467): undefined reference to `Queue::Queue()'
    Communication.cpp:(.text+0x47f): undefined reference to `Queue::~Queue()'
    collect2: ld returned 1 exit status
    merci...
    Onet

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Heu... Ligne de commande, OK, mais là, c'est du masochisme primaire ce que tu fais : pas de définition des répertoires d'inclusion, pour commencer, inclusions dans le code en chemins relatifs, link manuel des objets...

    Utilise un makefile, ou repasse sur un IDE qui fera ce genre de choses à ta place (soit dans un projet, soit en exportant le makefile).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Oui, effectiveemnt (que je sois maso, et qu'en plus il faille utiliser makefile :p).

    par contre, j'ai déja regardé ce lien, et il me donne de bonnes pistes... Sauf que je n'ai toujours pas les infos de quoi mettre pour pouvoir compiler mes classes avec mon projets principal... C'est ca qui me manque

    une idée? Merci.
    Onet

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Il te faut spécifier les répertoires d'inclusion à la compilation, compiler chaque module individuellement, puis les rassembler dans le linker.
    Notamment, il te faut virer ces horribles #include "../include/Communication.h" au profit de simples #include "Communication.h".

    Le tuto sur les makefiles te montrera comment faire ça, justement. Mais c'est par ce biais qu'il faut passer impérativement pour éviter d'avoir soit des oublis de (re)compilation, soit des erreurs de link.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Ok, je vois ce que tu veux dire, merci du retour.

    Dernière question, je pense, comment je compile une classe complète? A savoir son .h et son .cpp ? Car si je compile le .h, je me retrouve avec un .gch ?!?. Est-ce suffisant de ne compiler que le .cpp ?

    Merci.

    Onet

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par onet Voir le message
    Car si je compile le .h, je me retrouve avec un .gch ?!?.
    C'est les entêtes précompilés de GCC, ça.

    Citation Envoyé par onet Voir le message
    Est-ce suffisant de ne compiler que le .cpp ?
    Bien sûr, on ne compile en général QUE les CPP. Les entêtes ne se compilent pas directement, mais au travers d'un CPP (cas des fonctions inline, classes intégralement définies dans le .H, templates, etc.).
    Lorsque l'on parle de "compilation" d'entête, c'est un abus de langage qui signifie que l'on construit des entêtes précompilés.

    Donc : une classe "complète", c'est l'entête décrivant la classe + l'objet binaire issu de la compilation du CPP (ou la librairie contenant cet objet binaire, c'est pareil).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. map::find avec des classes perso
    Par regisportalez dans le forum SL & STL
    Réponses: 3
    Dernier message: 28/06/2010, 11h35
  2. Compilation minimale / Filtrage des classes utilisées
    Par atchoumix dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 08/06/2009, 09h09
  3. callback Win32 dans des classes perso
    Par NiamorH dans le forum Windows
    Réponses: 12
    Dernier message: 07/01/2007, 17h47
  4. [Débutant] J'ai un problème avec la compilation des classes
    Par Paulinho dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/11/2005, 14h23
  5. [javac] code pour lancer la compilation des classes
    Par viena dans le forum Général Java
    Réponses: 6
    Dernier message: 19/07/2004, 17h41

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