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

Systèmes de compilation Discussion :

Compilation avec makefile


Sujet :

Systèmes de compilation

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut Compilation avec makefile
    Bonjour

    Je suis en train d'apprendre makefile...
    J'ai un problème lors de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [troumad@portable][~/pendu]$ make
    gcc -o main.o -c main.c  $(pkg-config --cflags gtk+-2.0)
    gcc -o main.o pendu.o  $(pkg-config --libs gtk+-2.0)
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.1.2/../../../crt1.o: In function `_start':
    (.text+0x18): undefined reference to `main'
    collect2: ld returned 1 exit status
    make: *** [pendu] Erreur 1
    Pourtant, dans mon fichier main.c, j'ai bien la procédure int main(int argc, char **argv):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [...]
    extern unsigned char erreur;                                        /* nombre d'erreur ou avancement du pendu                        */
    extern unsigned char partie;                                        /* nombre de parties gagnées sans avoir été pendu                */
     
    int main(int argc, char **argv)
    {
     GtkWidget *p_main_box = NULL;                                      /* le conteneur principal                                        */
     GtkWidget *p_window = NULL;                                        /* la fenêtre      
    [...]
    Vous pouvez tout trouver sur : http://troumad.org/Linux/essai/pendu.zip
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    essaie donc avec ce 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    CC=gcc
     
    ERROR_CFLAGS = -Wall -W -pedantic
     
    GTK_CFLAGS=$$(pkg-config --cflags gtk+-2.0)
    CFLAGS = $(ERROR_FLAGS) $(GTK_CFLAGS)
    GTK_LDFLAGS = $$(pkg-config --libs gtk+-2.0)
    LDFLAGS = $(ERROR_FLAGS) $(GTK_LDFLAGS)
     
    EXEC=pendu
     
    all: $(EXEC)
     
    pendu : pendu.o main.o 
    	$(CC) -o pendu pendu.o main.o $(LDFLAGS)
     
    pendu.o : pendu.c pendu.h
    	$(CC) -o pendu.o -c pendu.c $(CFLAGS)
     
    main.o : main.c pendu.h
    	$(CC) -o main.o -c main.c $(CFLAGS)
     
    # Lancer avec "makefile clean"
    clean:
    	rm -rf *.o
     
    # Lancer avec "makefile mrproper" qui lancera aussi clean car clean en dépend
    mrproper: clean
    	rm -rf $(EXEC)
    si ca ne marche pas tu as toujours le script.
    et ton projet compile sans ce makefile?
    désolé mais je ne suis pas non plus un pro des makefiles...

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Que ce passe-t'il avec ce fichier 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CC=gcc
     
    ERROR_CFLAGS = -Wall -Wextra -pedantic
    GTK_CFLAGS=`pkg-config --cflags gtk+-2.0`
    CFLAGS = $(ERROR_FLAGS) $(GTK_CFLAGS)
     
    GTK_LDFLAGS = `pkg-config --libs gtk+-2.0`
    LDFLAGS = $(ERROR_FLAGS) $(GTK_LDFLAGS)
     
    SRC=main.c pendu.c
    OBJ=$(SRC:.c=.o)
    EXEC=pendu
     
    all: $(EXEC)
     
    $(EXEC) : $(OBJ)
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    main.o : pendu.h
    pendu.o: pendu.h
     
    %.o: %.c
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    .PHONY: clean mrproper
     
    # Lancer avec "makefile clean"
    clean:
    	rm -rf *.o
     
    # Lancer avec "makefile mrproper" qui lancera aussi clean car clean en dépend
    mrproper: clean
    	rm -rf $(EXEC)
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -o main.o pendu.o  $(pkg-config --libs gtk+-2.0)
    donc tu ecrases main.o.
    Il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -o myprog main.o pendu.o  $(pkg-config --libs gtk+-2.0)
    ou plus generalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc ${CFLAGS} ${OBJS} -o ${PROG} ${LIBS}

  5. #5
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Citation Envoyé par mujigka
    Que ce passe-t'il avec ce fichier 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    CC=gcc
     
    ERROR_CFLAGS = -Wall -Wextra -pedantic
    GTK_CFLAGS=`pkg-config --cflags gtk+-2.0`
    CFLAGS = $(ERROR_FLAGS) $(GTK_CFLAGS)
     
    GTK_LDFLAGS = `pkg-config --libs gtk+-2.0`
    LDFLAGS = $(ERROR_FLAGS) $(GTK_LDFLAGS)
     
    SRC=main.c pendu.c
    OBJ=$(SRC:.c=.o)
    EXEC=pendu
     
    all: $(EXEC)
     
    $(EXEC) : $(OBJ)
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    main.o : pendu.h
    pendu.o: pendu.h
     
    %.o: %.c
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    .PHONY: clean mrproper
     
    # Lancer avec "makefile clean"
    clean:
    	rm -rf *.o
     
    # Lancer avec "makefile mrproper" qui lancera aussi clean car clean en dépend
    mrproper: clean
    	rm -rf $(EXEC)
    Thierry
    Pour quelqu'un qui apprend à créer des makefiles, c'est pas une bonne idée d'attaquer comme ca!

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par lun4t1k
    Pour quelqu'un qui apprend à créer des makefiles, c'est pas une bonne idée d'attaquer comme ca!
    Je voulais juste savoir si la compilation fonctionnait avec ce Makefile, ou alors si le problème est ailleurs. J'avoue avec laissé l'aspect didactique un peu de côté...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Citation Envoyé par mujigka
    Je voulais juste savoir si la compilation fonctionnait avec ce Makefile, ou alors si le problème est ailleurs. J'avoue avec laissé l'aspect didactique un peu de côté...

    Thierry
    Il n'est pas trop tard !
    mais attendons quand même de savoir ce qu'il en est!
    personnellement, j'ai un peu la flaime de compiler tout son projet!

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    OK !

    lun4t1k a trouvé le premier la bonne réponse. DaZumba a bien expliqué l'origine de mon erreur. mujigka a fait un makefile compliqué que j'ai un peu compris.
    A propos de ce makefile :
    1) Le but de mon makefile est d'être un exemple simple pour faire partie des sources proposées par dvp.com. Dois-je prendre un cas simple ou l'exemple de mujigka ? A moins d'en mettre 2 un simple et un compliqué Pour l'exemple quoi !
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.o : pendu.h
    pendu.o: pendu.h
    ne peuvent pas être remplacé parPourquoi ?

    Sinon, comme j'avais une erreur, j'avais essayé de changer les extern de place (je me souvenais que j'en mettais, mais ça fais 13 ans que je n'ai plus fait de projets en C ) et donc ils étaient restés au mauvais endroit !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut

    Beaucoup veulent débuter, donc je pencherais déja vers un exemple simple!
    mais après expliquer un truc bien compliqué ne peut etre que bénéfique!

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Il n'y a rien de compliqué dans le makefile que j'ai donné, et le tutoriel http://gl.developpez.com/tutoriel/outil/makefile/ t'apprendra tout ce que je connais de make (j'utilise plus volontier SCons). Le gros avantage de ce makefile est que si tu ajoute un 3ème fichier source à ton projet, puis un 4ème, etc, les modifications à apporter au Makefile seront mineures.

    En ce qui concerne ta remarque concernant la possibilité d'écrire:
    Je n'en vois pas l'utilité dans la mesure où lorsque tu voudras ajouter de nouveaux fichiers à ton projet, il est peu probable que tous ces fichiers dépendent de l'en-tête pendu.h.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici quelques commentaires sur 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
    20
    21
    22
    23
    24
    # -TC- On liste tous les fichiers sources du projet 
    SRC=main.c pendu.c
    # -TC- Pour construire la liste des fichiers objets, c'est simple, car on veut
    # un fichier objet par fichier d'implantation
    OBJ=$(SRC:.c=.o)
    EXEC=pendu
     
    all: $(EXEC)
     
    # -TC- Instruction destinée à l'édition des liens. $@ correspond à la cible et $^à 
    # la liste des dépendances
    $(EXEC) : $(OBJ)
    	$(CC) -o $@ $^ $(LDFLAGS)
     
    # -TC- Ici, on liste les dépendances pour chaque fichier d'implantation
    main.o : pendu.h
    pendu.o: pendu.h
     
    # -TC- Enfin, on utilise une règle d'inférence générique pour la compilation 
    # des fichiers sources. $@ désigne la cible, et $< désigne la 1ère des 
    # dépendances. Cette manière de faire est utile lorsqu'on a plus de 2 fichiers
    # d'implantation à compiler
    %.o: %.c
    	$(CC) -o $@ -c $< $(CFLAGS)

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    encore

    Mais pourquoi ces -TC- en début de chaque commentaire.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Parce qu'il s'appelle Thierry et que son nom de famille commence par C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    il faut les laisser les TC sinon ton code ne marchera plus!


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

Discussions similaires

  1. Erreur compilation avec Makefile
    Par 30avril1989 dans le forum Systèmes de compilation
    Réponses: 0
    Dernier message: 24/03/2011, 15h33
  2. Erreur de compilation avec Makefile
    Par 30avril1989 dans le forum Qt
    Réponses: 10
    Dernier message: 22/03/2011, 13h58
  3. [XCode] Compilation avec makefile
    Par [Silk] dans le forum XCode
    Réponses: 3
    Dernier message: 28/12/2008, 16h03
  4. Probleme de compilation avec Makefile et Oracle V10
    Par miketidy dans le forum Linux
    Réponses: 2
    Dernier message: 10/09/2008, 09h48
  5. code::blocks vs compilation avec Makefile (qmake)
    Par ostralo dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 08/04/2008, 13h39

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