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 :

compilation g++ de plusieurs header


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut compilation g++ de plusieurs header
    Bonjour,
    J'ai une erreur à la compilation de mon programme et je n'arrive pas à trouver des explications sur la manière de compiler un fichier *.cpp qui charge plusieurs fichiers d'en-têtes *.h (avec #include "fichier1.h" etc.).
    Est-ce que vous pourvez me donner la ligne de commande pour compiler cette ensemble de fichiers ci-dessous, parce que g++ main_prog.cpp -o main_prog provoque cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main_prog.cpp: (.text+0x24df): undefined reference to `prog1(double, double, short*, short*)'
    main_prog.cpp: (.text+0x2854): undefined reference to `prog2(std::basic_string<char,...)
    main_prog.cpp: (.text+0x3c76): undefined reference to `prog1(double, double, short*, short*)'
    main_prog.cpp: (.text+0x3fe5): undefined reference to `prog2(std::basic_string<char,...)
    collect2: ld a retourné 1 code d'état d'exécution
    prog1.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef prog1_h
    #define prog1_h
    /* function prototype */
    int prog1(double a, double b, short *c, short *d);
    #endif
    prog1.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    int prog1(double a, double b, short *c, short *d)
    {
    etc.
    }
    prog2.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef prog2_h
    #define prog2_h
    /* function prototype */
    #include<string>
    void prog2(std::string file, ...);
    #endif
    prog2.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <stdlib.h>
    #include <vector>
    using namespace std;
    void prog2(std::string file, ...)
    {
    etc.
    }
    main_prog.cpp :
    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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <new>
    #include <iomanip>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #include <sstream>
    #include "prog1.h"
    #include "prog2.h"
    using namespace std;
    int main(int argc, char *argv[])
    {
    etc.
      prog1(w,x,&y,&z);
    etc.
      prog2(file, etc.);
      return 0;
    }
    Compilation :
    g++ -c prog1.cpp --> Pas d'erreur à la compilation
    g++ -c prog2.cpp --> Pas d'erreur à la compilation
    g++ -c main_prog.cpp --> Erreurs listées ci-dessus

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Le plus simple pour 2/3 fichiers c'est de tout compiler en une fois.
    g++ prog1.cpp prog2.cpp main_prog.cpp -o prog && ./prog
    Sinon il faut pour chaque fichier générer le fichier objet correspondant, et linker le tout après (ce que tu ne fais pas ici d'où tes erreurs).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Le plus simple pour 2/3 fichiers c'est de tout compiler en une fois.


    Sinon il faut pour chaque fichier générer le fichier objet correspondant, et linker le tout après (ce que tu ne fais pas ici d'où tes erreurs).
    Merci beaucoup Davidbrcz, ça marche bien ce que tu m'as écris. J'avais des difficultés à trouver ce genre de ligne de commande. Ça doit être dû au fait que l'utilisation d'un environnement de programmation avec création de projet et compilateur intégré sont largement + utilisés... mais là je dois faire avec les moyens du bord.

    Citation Envoyé par Davidbrcz Voir le message
    Non, s'il n'y aucun appel des fonctions entre elle, pas besoin des prototypes. Ils servent juste à dire au compilateur "ca machin est une fonction, tu auras les détails plus tard". De plus, ca aurait donné une erreur de compilation, là le PO a une erreur de linker.

    je ne peux que t'inviter à te pencher sur les phases d'une compilation (pre-processeur/compilation/linkage)
    J'allais prendre en compte ce que atttchoum disait alors merci pour cette correction.
    Merci qd même atttchoum pour la tentative d'aide.

    Maintenant je vais également devoir créer une librairie partagée de tout ça.
    J'ai fais un test qui ne me crée par d'erreur à l'execution mais je vais surtout voir ce que cela donne lorsque je vais essayer d'utiliser cette librairie.
    J'ai fais ceci : sur les fichiers (prog1.cpp, prog2.cpp et main_prog.cpp) suivi de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld -G *.o -o libprogramme.so
    Si tu repères un problème, tu peux me le dire stp.

    Bonne journée

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Il ne faut pas de fonction main dans un fichier .so

    Sinon, je ne me rappelle plus des commandes exactes (je ne créer quasiment jamais des .so ou des .a)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    arf au temps pour moi j'étais trop dans le C++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Il ne faut pas de fonction main dans un fichier .so

    Sinon, je ne me rappelle plus des commandes exactes (je ne créer quasiment jamais des .so ou des .a)
    OK Merci. Je vais voir ça avec des tests. Je ne suis plus bloqué là.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    Citation Envoyé par alter Voir le message
    prog1.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef prog1_h
    #define prog1_h
    /* function prototype */
    int prog1(double a, double b, short *c, short *d);
    #endif
    prog1.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    int prog1(double a, double b, short *c, short *d)
    {
    etc.
    }
    dans tes prog.cpp tu dois rajouter un #include "prog.h" sinon il trouve la déclaration des fonction (donc pas d'erreur de compilation) mais il ne trouve pas leur implémentation (d'où l'erreur de linkage).
    de plus d'ordinaire on mais les #include <cmath>,... dans les *.h

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    dans tes prog.cpp tu dois rajouter un #include "prog.h" sinon il trouve la déclaration des fonction (donc pas d'erreur de compilation) mais il ne trouve pas leur implémentation (d'où l'erreur de linkage).
    de plus d'ordinaire on mais les #include <cmath>,... dans les *.h
    Non, s'il n'y aucun appel des fonctions entre elle, pas besoin des prototypes. Ils servent juste à dire au compilateur "ca machin est une fonction, tu auras les détails plus tard". De plus, ca aurait donné une erreur de compilation, là le PO a une erreur de linker.

    je ne peux que t'inviter à te pencher sur les phases d'une compilation (pre-processeur/compilation/linkage)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. comment créer un raport contenant plusieurs headers ?
    Par slahedine dans le forum Reports
    Réponses: 7
    Dernier message: 04/03/2010, 17h20
  2. Compiler Boost avec plusieurs MSVC installés
    Par camboui dans le forum Boost
    Réponses: 5
    Dernier message: 07/09/2009, 12h07
  3. Compilation app sous plusieurs OS et arch
    Par mercure07 dans le forum Qt
    Réponses: 2
    Dernier message: 08/04/2008, 09h02
  4. [JTable] Mettre plusieurs headers sur un JTable
    Par banania dans le forum Composants
    Réponses: 2
    Dernier message: 09/07/2007, 20h49
  5. compilation projet ( en plusieur fichier )
    Par damien77 dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 21/02/2007, 23h46

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