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 :

Makefile et undefined reference..


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Par défaut Makefile et undefined reference..
    Bonjour, je voudrais créer un petit projet respectant cette arborescence :
    ./Makefile
    ./main.cpp
    ./include/OutilsPGM.h
    ./source/OutilsPGM.c

    Il y a bien l'include de OutilsPGM.h dans OutilsPGM.c :
    #include "../include/OutilsPGM.h"

    Ainsi que l'include de OutilsPGM.h dans main.cpp :
    #include "include/OutilsPGM.h"

    Je ne comprends donc pas les erreurs 'undefined reference' montrées plus bas...

    EDIT: Je n'ai pas précisé mais je suis sur Linux

    Voici la tête de mon Makefile
    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
    CPP=g++
    CPPFLAGS=-O3 
    SRC=./source/
     
    all : main
     
    main : main.o $(SRC)OutilsPGM.o 
    	$(CPP) $(CPPFLAGS) -o main main.o $(SRC)OutilsPGM.o -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11  -lXt -lXi -lXmu -lXext -lX11 -lm 
     
    main.o : main.cpp 
    	$(CPP) $(CPPFLAGS) -o main.o -c main.cpp
     
    OutilsPGM.o : $(SRC)OutilsPGM.c
    	$(CPP) $(CPPFLAGS) -o $(SRC)OutilsPGM.o -c $(SRC)OutilsPGM.c
     
    clean :
    	rm -f $(SRC)*.o
    	rm -f *.o
    	rm -f main
    Voici l'erreur lors de la commande 'make' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ make
    g++ -O3  -o main.o -c main.cpp
    g++ -O3  -o main main.o ./source/OutilsPGM.o -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11  -lXt -lXi -lXmu -lXext -lX11 -lm
    main.o: In function `main':
    main.cpp:(.text+0xfb2): undefined reference to `LireImage(char*, Image*)'
    main.cpp:(.text+0xfde): undefined reference to `CreerImage(Image*, int, int)'
    main.cpp:(.text+0xffc): undefined reference to `CreerImage(Image*, int, int)'
    main.o: In function `ChoixMenuPrincipal(int)':
    main.cpp:(.text+0x20a8): undefined reference to `LibererImage(Image*)'
    main.cpp:(.text+0x20b4): undefined reference to `LibererImage(Image*)'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [main] Erreur 1
    Je vous remercie de vos futures réponses!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    Bonjour,

    Citation Envoyé par Daikyo Voir le message
    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    main : main.o $(SRC)OutilsPGM.o 
    	$(CPP) $(CPPFLAGS) -o main main.o $(SRC)OutilsPGM.o -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11  -lXt -lXi -lXmu -lXext -lX11 -lm 
    
    main.o : main.cpp 
    	$(CPP) $(CPPFLAGS) -o main.o -c main.cpp
    
    OutilsPGM.o : $(SRC)OutilsPGM.c
    	$(CPP) $(CPPFLAGS) -o $(SRC)OutilsPGM.o -c $(SRC)OutilsPGM.c
    « OutilsPGM.o » n'est pas la même chose que « $(SRC)OutilsPGM.o ». Comme, en plus, le second doit déjà exister (compilé à la main ou par une version précédente du Makefile), make vérifie l'existence de ce fichier, mais ne l'associe pas du tout à la règle qui est censée lui correspondre.

    Ça tend à se confirmer en lisant la sortie :

    Voici l'erreur lors de la commande 'make' :
    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ make
    g++ -O3  -o main.o -c main.cpp
    g++ -O3  -o main main.o ./source/OutilsPGM.o -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11  -lXt -lXi -lXmu -lXext -lX11 -lm
    Où l'on s'aperçoit que OutilPGM.c n'est pas compilé. Cependant, ce n'est pas une certitude. Si la dépendance était bien honorée, il suffirait que OutilPGM soit déjà à jour pour que cette étape soit passée.

    D'autre part, il semble que tu mélanges des programmes en C et en C++ : dans ce cas, il faut compter avec la décoration des noms de fonctions. Il ne faut pas oublier de mettre tous les #include et déclarations strictement C à l'intérieur d'un bloc « extern "C" { } », autrement, le linker recherchera les mauvais symboles.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Par défaut
    Bonsoir,

    Je suis désolé mais je ne comprends pas, je suis vraiment inexpérimenté en Makefile. Je l'ai légèrement changé :

    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
    CPP=g++
    CPPFLAGS=-O3 
    SRC=source/
     
    all : main
     
    main : main.o OutilsPGM.o 
    	$(CPP) $(CPPFLAGS) -o main main.o OutilsPGM.o -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lX11  -lXt -lXi -lXmu -lXext -lX11 -lm 
     
    main.o : main.cpp 
    	$(CPP) $(CPPFLAGS) -o main.o -c main.cpp
     
    OutilsPGM.o : $(SRC)OutilsPGM.c
    	$(CPP) $(CPPFLAGS) -o OutilsPGM.o -c $(SRC)OutilsPGM.c
     
    clean :
    	rm -f *.o
    	rm -f main
    Et j'ai rajouté le symbole extern comme vous me l'avez conseillé mais j'ai toujours la même erreur... Je ne suis pas sûr d'avoir compris votre réponse.

    Cordialement

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    Bonsoir,

    − As-tu fait un make clean après avoir modifié ton Makefile ?
    − Peux-tu poster ici le morceau de code (avec les balises CODE) représentant le « extern « C » { … } » et la liste de ce qu'il contient ?

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Par défaut
    Bonsoir, désolé pour la réponse tardive.

    Oui j'ai bien fait un make clean afin de supprimer tous les .o qui trainaient pour tout refaire mais rien ne change.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C"
    {
    #include "include/OutilsPGM.h"
    }

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    C'est étrange. Es-tu sûr que OutilPGM.c est complet ? Et que les fonctions qu'il contient ont la bonne signature ?

    Sinon, il est possible que cela vienne de là (à vérifier) :

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OutilsPGM.o : $(SRC)OutilsPGM.c
    	$(CPP) $(CPPFLAGS) -o OutilsPGM.o -c $(SRC)OutilsPGM.c

    Si tu utilises le compilateur C++ pour compiler un fichier C, alors il est possible que ledit compilo considère quand même celui-ci comme un fichier C++ et ajoute des décorations à tes fonctions. Essaie de remplacer $(CPP) par $(CC) et $(CPPFLAGS) par $(CFLAGS).

    M'enfin, cela reste curieux. GCC devrait être capable de retomber lui-même sur ses pattes.

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

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. makefile, : undefined reference to
    Par michel.di dans le forum Systèmes de compilation
    Réponses: 0
    Dernier message: 02/10/2009, 11h32
  3. Compilation de xmms : undefined reference to...
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/02/2005, 19h05
  4. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38
  5. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23

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