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 :

Makefile


Sujet :

Systèmes de compilation

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Makefile
    Hello,
    Voila mon "problème": j'ai réalisé un petit programme ayant pas mal de fichiers, et je souhaite le faire fonctionner sous linux. Pour ca, j'ai lu quelques tutos sur le makefile, mais ca n'est toujours pas clair dans ma tête. J'en ai fait un et jaimerai, n'ayant pas avant ce week end la possibilité de le tester sopus linux, votre avis.
    Mes fichier sont organisé de la manière suivante (simplifiée, avec A->B = Le fichier A utilise le fichier B (les include quoi )

    A->B
    B->(C,E,F)
    C->D
    D->(E,F)
    E->(rien: stdlib etc...)
    F->(rien)

    (A,B,C,D,E,F)->G.h (G est un fichier .h contenant toutes les macros utilisées dans tout le programme)

    En considérant que mon fichier A est le main, j'ai fait le makefile suivant:
    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
     
    OBJ = A.o B.o C.o D.o E.o F.o
    PROG = P
    CC = gcc
     
    $(PROG): $(obj)
        $(CC) $(obj) -o $(PROG)
     
    A.o: A.c
        $(CC) -c A.c
     
    B.o: B.c
        $(CC) -c B.c
     
    C.o: C.c
        $(CC) -c C.c
     
    D.o: D.c
        $(CC) -c D.c
     
    E.o: E.c
        $(CC) -c E.c
     
    F.o: F.c
        $(CC) -c F.c
    Voila je sens que c'est pas suffisant voir même a coté de la plaque, et comme je peut pas tester pr l'instant je voulais avoir vos conseils.
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Essaye ca

    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
     
    CC=gcc
    FLAGS=-Wall -ansi -pedantic -Werror -W
     
    all : monprog
     
    F.o : F.c G.h
    	$(CC) $(FLAGS) F.c -c
     
    E.o : E.c G.h
    	$(CC) $(FLAGS) F.c -c
     
    D.o : D.c E.c F.c G.h
    	$(CC) $(FLAGS) D.c E.c F.c -c
     
    C.o : C.c D.cG.h
    	$(CC) $(FLAGS) C.c D.c -c
     
    B.o : B.c C.c E.c F.c G.h
    	$(CC) $(FLAGS) B.c C.c E.c F.c -c
     
    A.o : A.c B.c G.h
    	$(CC) $(FLAGS) A.c B.c -c
     
    monprog : A.o B.o C.o D.o E.o F.o
    	$(CC) A.o B.o C.o D.o E.o F.o $(FLAGS) -o monprog
     
    clean :
    	rm monprog *.o
    On peut encore l'ameliorer mais je ne me rappelle plus comment.
    Je vais chercher un peu, si je trouve, je rajouterai.

    [edit]
    Tu peux regarder la si tu veux
    http://gl.developpez.com/tutoriel/outil/makefile/
    [/edit]
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Voilà comment j'aurais fait.
    En estimant que tout les fichiers sont dans le même repertoire (ce que je ne fais jamais).
    Attention aux tabulations qui ne sont pas représenté ici.

    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
    34
    35
    36
    37
    38
     
    #makefile
     
    BIN      = prog
    CC       = gcc
    LD       = gcc
    CFLAGS   = -C -Wall
    LDFLAGS  =
     
    OBJECTS = A.o B.o C.o D.o E.o F.o
     
     
    #REGLE GENERALE (souvent chaque fichier possede un .c et un .h, a adpater)
    %.o: %.c %.h makefile
       $(CC) $(CFLAGS) $< -o $@
     
     
    #CREATION DE L'EXECUTABLE
    $(BIN): $(OBJECTS)
       $(LD) $(LDFLAGS) $^ -o $@
     
     
    #DEPENDANCES
    A.o: B.h
     
    B.o: C.h E.h F.h
     
    C.o: D.h
     
    D.o: E.h F.h
     
     
    #NETOYAGE
    clean:
       rm -f *.o
     
    cleanall: clean
       rm -f $(BIN)
    Les symboles:
    $< : premiere dépendance
    $@: cible
    $^: toutes les dépendances

    dans ce makefile
    %o = tous les .o
    %.c = le .c du même non que le .o
    %.h = le .h du même non que le .o

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Merci de ton aide.
    Pr le tutos je l'ai déja regardé ^^ ms il ne traite pas d'exemple compliqué (avec de nombreux fichiers etc..).
    Dc si j'ai bien compris il faut commencer par les fichier ne dépendant d'aucun autre pour arriver au main? (j'ai fait l'inverse... lol)
    De plus j'avais ps géré vraiment les dépendances en fait...

    Bref merci de ton aide ton makefile a l'air parfait je testerai ce week end quand j'aurai accés a linux.

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par MatRem
    Voilà comment j'aurais fait. En estimant que tout les fichiers sont dans le même repertoire (ce que je ne fais jamais). Attention aux tabulations qui ne sont pas représenté ici.

    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
    34
    35
    36
    37
    38
     
    #makefile
     
    BIN      = prog
    CC       = gcc
    LD       = gcc
    CFLAGS   = -C -Wall
    LDFLAGS  =
     
    OBJECTS = A.o B.o C.o D.o E.o F.o
     
     
    #REGLE GENERALE (souvent chaque fichier possede un .c et un .h, a adpater)
    %.o: %.c %.h makefile
       $(CC) $(CFLAGS) $< -o $@
     
     
    #CREATION DE L'EXECUTABLE
    $(BIN): $(OBJECTS)
       $(LD) $(LDFLAGS) $^ -o $@
     
     
    #DEPENDANCES
    A.o: B.h
     
    B.o: C.h E.h F.h
     
    C.o: D.h
     
    D.o: E.h F.h
     
     
    #NETOYAGE
    clean:
       rm -f *.o
     
    cleanall: clean
       rm -f $(BIN)
    Merci a toi. Je suis pas encore assez au point sur les makefile pr comprendre tout ce que tu as fait (notament l'histoire des règles générales ou de l'executable: $^ et $<) mais je vais regarder tout ca.

    Merci encore

  6. #6
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Dc si j'ai bien compris il faut commencer par les fichier ne dépendant d'aucun autre pour arriver au main? (j'ai fait l'inverse... lol)
    Au contraire, il faut commencer par qqch qui dépend de tout le reste, c'est d'ailleurs ce qu'à fait skyrunner:

  7. #7
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    T'inquiète pas y'a rien de sorcier .

    #REGLE GENERALE (souvent chaque fichier possede un .c et un .h, a adpater)
    %.o: %.c %.h makefile
    $(CC) $(CFLAGS) $< -o $@
    En fait ces lignes permettent de dire a make comment seront créés les .o par défaut.

    C'est à dire qu'il faudra les recompilers si le .c ou le .h corespondant changent, mais aussi si le makefile change.
    Il faudra donc le compiler comme ça:
    $(CC) $(CFLAGS) $< -o $@
    c'est à dire gcc -c -Wall fichier.c -o fichier.o

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Citation Envoyé par MatRem
    Au contraire, il faut commencer par qqch qui dépend de tout le reste, c'est d'ailleurs ce qu'à fait skyrunner:
    Oui mais ensuite il a commencé par les fichiers indépendants
    Que fait cette instruction d'ailleur? Mais skyrunner a également fini par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monprog : A.o B.o C.o D.o E.o F.o
        $(CC) A.o B.o C.o D.o E.o F.o $(FLAGS) -o monprog
    et je pensais que c'était justement par ca qu'il fallait commencer..

  9. #9
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    En fait make suit la première cible qu'il trouve.

    Dans ce cas c'est all. Comme all dépend de monprog, il va directement à la cible monprog.

    Donc ça revient au même de mettre directement la cible monprog au début et d'enlever la cible all.

Discussions similaires

  1. Makefile et sed
    Par pitistef dans le forum Systèmes de compilation
    Réponses: 7
    Dernier message: 10/02/2004, 15h06
  2. [Makefile] [Avancé]Récupération de dépendances
    Par Ruok dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 06/02/2004, 12h52
  3. [Debutant] Makefile
    Par Jfrancois57 dans le forum Systèmes de compilation
    Réponses: 8
    Dernier message: 26/01/2004, 13h18
  4. Makefile
    Par Wisefool dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 03/11/2003, 17h41
  5. Compilation avec un Makefile
    Par Mau dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 28/02/2003, 11h30

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