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

Linux Discussion :

Un Makefile qui doit compiler plusieurs fichiers main


Sujet :

Linux

  1. #1
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut Un Makefile qui doit compiler plusieurs fichiers main
    Bonjour,

    Voici ma liste de fichiers :

    • Makefile
    • liba.h
    • libb.h
    • libc.h
    • liba.cc
    • libb.cc
    • libc.cc
    • main.cc
    • main1.cc
    • main2.cc


    Voici le contenu 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
    20
    21
    22
    23
    24
    25
     
    CC=g++
    RM=rm -rfv
    EXEC=main.out main1.out main2.out
    OBJECTS=liba.o libb.o libc.o
     
    all: $(EXEC)
     
    main.out: main.cc $(OBJECTS)
    	$(CC) $< $(OBJECTS) -o $@
     
    main1.out: main1.cc $(OBJECTS)
    	$(CC) $< $(OBJECTS) -o $@
     
    main2.out: main2.cc $(OBJECTS)
    	$(CC) $< $(OBJECTS) -o $@
     
    %.o: %.cc %.h
    	$(CC) -c $<
     
    clean: 
    	$(RM) $(OBJECTS)
     
    mrproper: clean
    	$(RM) $(EXEC)
    Ça fonctionne plutôt bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ make
    g++ -c liba.cc
    g++ -c libb.cc
    g++ -c libc.cc
    g++ main.cc liba.o libb.o libc.o -o main.out
    g++ main1.cc liba.o libb.o libc.o -o main1.out
    g++ main2.cc liba.o libb.o libc.o -o main2.out
    Comme vous pouvez le remarquer, il y a un peu de redondance dans les règles du Makefile. J'ai donc essayé d'ajouter une règle d'inférence supplémentaire.

    Voici mon nouveau 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
     
    CC=g++
    RM=rm -rfv
    EXEC=main.out main1.out main2.out
    OBJECTS=liba.o libb.o libc.o
     
    all: $(EXEC)
     
    %.out: %.cc $(OBJECTS)
    	$(CC) $< $(OBJECTS) -o $@
     
    %.o: %.cc %.h
    	$(CC) -c $<
     
    clean: 
    	$(RM) $(OBJECTS)
     
    mrproper: clean
    	$(RM) $(EXEC)
    Mais hélas le résultat n'est pas fameux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ make
    g++ -c liba.cc
    g++ -c libb.cc
    g++ -c libc.cc
    g++ main.cc liba.o libb.o libc.o -o main.out
    g++ main1.cc liba.o libb.o libc.o -o main1.out
    g++ main2.cc liba.o libb.o libc.o -o main2.out
    rm libc.o liba.o libb.o
    Je ne sais pas pour quelle raison, mais il effectue une suppresion de mes fichiers .o à la fin...
    Du coup, si je fais une modification sur un fichier main, il me recompile tous les .o :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $ make
    make: Rien à faire pour « all ».
    $ touch main.cc
    $ make
    g++ -c liba.cc
    g++ -c libb.cc
    g++ -c libc.cc
    g++ main.cc liba.o libb.o libc.o -o main.out
    g++ main1.cc liba.o libb.o libc.o -o main1.out
    g++ main2.cc liba.o libb.o libc.o -o main2.out
    rm libc.o liba.o libb.o
    Est-ce que vous pouvez m'expliquer pourquoi il supprime les fichiers .o?
    Avez-vous une solution à ce problème?

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    Le plus drôle, c'est que si tu supprimes la règle « clean » et le rm associé, ça fonctionne encore !

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    …
    g++ -c liba.cc
    g++ -c libb.cc
    g++ -c libc.cc
    g++ main.cc liba.o libb.o libc.o -o main.out
    g++ main1.cc liba.o libb.o libc.o -o main1.out
    g++ main2.cc liba.o libb.o libc.o -o main2.out
    rm libc.o liba.o libb.o

    En fait, c'est dû à tes règles implicites : tu déclares %.o d'un côté, et tu mets $(OBJECTS) dans tes dépendances, mais à aucun moment il n'y a de règle explicite pour créer ces fichiers. Même le nom de sortie dans la ligne de commande est laissé à la discrétion du compilo. Du coup, make pense qu'il s'agit de fichiers intermédiaires créés par lui et fait le ménage quand il a fini.

    On en parle ici et .

  3. #3
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Merci pour les liens.
    J'ai trouvé cette solution (utilisation de .PRECIOUS) :

    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
     
    CC=g++
    RM=rm -rfv
    EXEC=main.out main1.out main2.out
    OBJECTS=liba.o libb.o libc.o
     
    .PRECIOUS : $(OBJECTS)
     
    all: $(EXEC)
     
    %.out: %.cc $(OBJECTS)
    	$(CC) $< $(OBJECTS) -o $@
     
    %.o: %.cc %.h
    	$(CC) -c $<
     
    clean: 
    	$(RM) $(OBJECTS)
     
    mrproper: clean
    	$(RM) $(EXEC)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 402
    Points : 23 785
    Points
    23 785
    Par défaut
    « PRECIOUS », ça sert à dire que les fichiers qui auraient normalement dus être détruits sont précieux, pour une raison ou une autre, et que tu veux faire une exception. Sémantiquement, ce n'est pas le plus approprié.

    C'est surtout .SECONDARY qu'il faut utiliser.

  5. #5
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Oui effectivement j'ai lu la documentation de Make :
    http://www.gnu.org/software/make/manual/
    Et .SECONDARY semble plus adapté d'après la description qui en est faite.
    Je l'ai testé, ça semble fonctionner également.

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

Discussions similaires

  1. [XL-2010] Classeur qui compile plusieurs fichiers
    Par yaya.gaga dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2014, 15h00
  2. [MEX] Problème pour compiler plusieurs fichiers
    Par Leiloche dans le forum MATLAB
    Réponses: 3
    Dernier message: 28/10/2008, 13h57
  3. Réponses: 2
    Dernier message: 07/06/2006, 11h44
  4. [py2exe] Compiler plusieurs fichiers
    Par Guldin dans le forum Py2exe
    Réponses: 3
    Dernier message: 03/05/2006, 16h24
  5. formulaire qui doit appeler plusieurs pages
    Par rohel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 27/01/2005, 08h59

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