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

  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 477
    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 477
    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 477
    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 477
    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 477
    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 477
    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.

  7. #7
    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
    J'ai commenté tous les appels de fonctions relatifs à OutilsPGM dans le main.cpp et ça fonctionne... Dès que je veux les utiliser, ça marque le undefined reference...

    Je reposte le Makefile au cas où :
    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 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 *.o
    	rm -f source/*.o
    	rm -f main
    dans le OutilsPGM.c, j'ai bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "../include/OutilsPGM.h"
    et dans le main.cpp, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
    #include <GL/glut.h>
    #include <math.h>
    #include <unistd.h>
    extern "C"
    {
    #include "include/OutilsPGM.h"
    }
    OutilsPGM.h et OutilsPGM.c ont bien les mêmes signatures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int CreerImage(Image *image, int largeur, int hauteur);
    int LireImage(char *nom, Image *image);
    int EcrireImage(char *nom, Image *image);
    void LibererImage(Image *i);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int CreerImage(Image *image, int largeur, int hauteur)
    { ... }
    int LireImage(char *nom, Image *image)
    { ... }
    int EcrireImage(char *nom, Image *image)
    { ... }
    void LibererImage(Image *i)
    { ... }

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    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 477
    Par défaut
    Citation Envoyé par Daikyo Voir le message
    J'ai commenté tous les appels de fonctions relatifs à OutilsPGM dans le main.cpp et ça fonctionne... Dès que je veux les utiliser, ça marque le undefined reference...

    Je reposte le Makefile au cas où.
    As-tu fait les modifs citées ci-dessus ? :

    Citation Envoyé par Obsidian Voir le message
    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).

  9. #9
    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
    J'ai changé comme conseillé et ça fonctionne ! J'avoue que je ne comprends pas trop pourquoi... Je pensais que les $(...) étaient des sortes de variables...

    Là j'ai simplement changé ce que vous m'avez dit comme conseillé seulement à la ligne citée. Donc en haut du fichier, j'ai laissé $(CPP) et $(CPPFLAGS).
    Je comprends pas trop comment ça fonctionne ces genres de flags et pourquoi dans le cas présent, ça fonctionne sans "déclaration" en tête du Makefile.

    Cependant, merci beaucoup pour la solution et pour votre patience !

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    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 477
    Par défaut
    Citation Envoyé par Daikyo Voir le message
    Là j'ai simplement changé ce que vous m'avez dit comme conseillé seulement à la ligne citée. Donc en haut du fichier, j'ai laissé $(CPP) et $(CPPFLAGS).

    Cependant, merci beaucoup pour la solution et pour votre patience !
    Parce qu'il n'y a pas que des flags : $(CPP) contient le nom du compilateur C++ et $(CC) celui du compilateur C.

    En faisant $(CPP) OutilPGM.c, le fichier C était quand même traité comme un fichier C++, et le fichier objet engendré recevait des noms de fonctions décorés. L'autre programme recherchant des fonctions C sans décoration, il ne les trouvait pas.

  11. #11
    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,
    Merci pour ce complément d'informations et encore merci pour le coup de main

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    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 477
    Par défaut
    Citation Envoyé par Daikyo Voir le message
    Bonsoir,
    Merci pour ce complément d'informations et encore merci pour le coup de main
    À ton service.

    À noter toutefois qu'il y avait probablement deux erreurs : celle du Makefile et celle du compilateur : au départ, tout était compilé comme du C++, sans « extern », donc la compilation aurait dû retomber sur ses pattes et trouver les décorations, mais les dépendances du Makefile se faisaient au mauvais endroit. Ensuite, on a ajouté « extern » et résolu les dépendances. Il devait donc trouver le bon fichier, cette fois, mais avec les mauvaises décorations, du coup. D'où deux causes différentes pour une même conséquence.

    C'est ça, les joies du débuggage. :-)

+ 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