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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut Makefile....
    Bonjour a toutes et a tous!!

    Je me suis lance dans la confection d'un Makefile mais la je suis dans une impasse...

    Voici le Makefile en question

    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
     
    CC = gcc
    CFLAGS = -g -W -Wall
    EXEPATH = exe/
    OBJPATH = obj/
    SRCPATH = src/
    INCLUDEPATH = include/
     
    OBJ = $(OBJPATH)main.o $(OBJPATH)plop.o
     
    plop : $(OBJPATH)$(OBJ)
    	$(CC) $(OBJPATH)$(OBJ) -o $(EXEPATH)plop
     
    plop.o : $(SRCPATH)plop.c $(INCLUDEPATH)plop.h
    main.o : $(SRCPATH)main.c $(INCLUDEPATH)plop.h
    Il est assez simple et pourtant quand je lance la commande "make", il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    make: *** Pas de règle pour fabriquer la cible `main.c', nécessaire pour `main.o'. Arrêt.
    Je vois pas trop ce qu'il veut dire en fait...

    Merci de votre aide!!
    vincent

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: Makefile....
    Citation Envoyé par vince3320
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    make: *** Pas de règle pour fabriquer la cible `main.c', nécessaire pour `main.o'. Arrêt.
    Je vois pas trop ce qu'il veut dire en fait...
    Salut,

    make te dit qu'il ne sait pas comment créer le fichier main.c,
    en gros il ne le trouve pas.
    Es-tu sûr de bien l'avoir mis dans le répertoire src ?
    Tu lance bien le make du bon répertoire (la racine de ton projet) ?

    De plus, dans ton Makefile, il manque les lignes de compilation des fichiers .c

    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Tous les fichier sont au bon endroi
    J'ai refait un peu le 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
     
    CC = gcc
    CFLAGS = -g -W -Wall
    EXEPATH = exe/
    OBJPATH = obj/
    SRCPATH = src/
     
    OBJ = $(OBJPATH)main.o $(OBJPATH)plop.o
    SRC = $(SRCPATH)main.c $(SRCPATH)plop.c
     
    plop : $(OBJ)
    	$(CC) $(SRC) -o $(EXEPATH)plop
     
    plop.o : $(SRCPATH)plop.c $(SRCPATH)plop.h
    main.o : $(SRCPATH)main.c $(SRCPATH)plop.h
     
    clean:
    	rm -f $(OBJ) $(EXEPATH)plop
    et maintenant, il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    make: *** Pas de règle pour fabriquer la cible `obj/main.o', nécessaire pour `plop'. Arrêt.
    snif
    ze comprends rien la...

    De quelles lignes parles tu?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vince3320
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    plop.o : $(SRCPATH)plop.c $(SRCPATH)plop.h
    main.o : $(SRCPATH)main.c $(SRCPATH)plop.h
    Dans ces deux lignes tu indiques quel fichiers son néccéssaire pour créer les fichier plop.o et main.o

    Tu dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $(OBJPATH)plop.o : $(SRCPATH)plop.c $(SRCPATH)plop.h
    	$(CC) -c $(CFLAGS) $(SRCPATH)plop.c -o $(OBJPATH)plop.o
     
    $(OBJPATH)main.o : $(SRCPATH)main.c $(SRCPATH)plop.h
    	$(CC) -c $(CFLAGS) $(SRCPATH)main.c -o $(OBJPATH)main.o
    et ca devrait marcher...
    Il faudra peut-être ajouter à la fin -I$(INCLUDEPATH)

    a++

    [edit] Les balises [ code ] n'était pas bien mise...

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Makefile....
    Citation Envoyé par vince3320
    Je me suis lance dans la confection d'un Makefile mais la je suis dans une impasse...
    <snip>
    Visiblement tu n'as aucune idée de la façon de réaliser un makefile. Il faut lire la doc à fond est s'y conformer strictement (Attention aux tabulations obligatoires. Il y en a 3 dans mon exemple). Voici un exemple inspiré de ta demande.

    Les fichiers sources:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* main.c */
    #include "include/plop.h"
     
    int main (void)
    {
       plop ();
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef H_PLOP
    #define H_PLOP
    /* plop.h */
     
    void plop (void);
     
    #endif /* guard */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* plop.c */
    #include "include/plop.h"
     
    #include <stdio.h>
     
    void plop (void)
    {
       puts ("Hello world");
    }
    Le makefile commenté correspondant:
    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
    39
    40
    41
    42
    43
    # makefile
     
    # Paths
    EXEPATH = exe/
    OBJPATH = obj/
    SRCPATH = src/
    INCLUDEPATH = include/
     
    #extentions (system dependent)
    EXT_EXE = exe
    EXT_OBJ = o
    EXT_LIB = a
     
    # standard library path (compiler dependent)
    LIBDJGPP = D:/DJGPP/LIB/
     
    # Compiler command
    CFLAGS = -c -g -W -Wall \
     -I.
     
    CC = gcc $(CFLAGS)
     
    # Linker command
    LD = ld $(OBJS)                  \
       $(LIBDJGPP)crt0.$(EXT_OBJ)    \
       $(LIBDJGPP)libc.$(EXT_LIB)    \
    
    # Objects list
    OBJS = \
           $(OBJPATH)main.$(EXT_OBJ) \
           $(OBJPATH)plop.$(EXT_OBJ) \
    
    # main target (made by the linker)
    $(EXEPATH)plop.$(EXT_EXE) : $(OBJS)
    	$(LD) -o$(EXEPATH)plop.$(EXT_EXE)
     
    # sub targets (made by the compiler)
     
    $(OBJPATH)plop.$(EXT_OBJ) : $(SRCPATH)plop.c $(INCLUDEPATH)plop.h MAKEFILE
    	$(CC) $(SRCPATH)plop.c -o$(OBJPATH)plop.$(EXT_OBJ)
     
    $(OBJPATH)main.$(EXT_OBJ) : $(SRCPATH)main.c $(INCLUDEPATH)plop.h MAKEFILE
    	$(CC) $(SRCPATH)main.c -o$(OBJPATH)main.$(EXT_OBJ)
    et la liste de fichiers du repertoire
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     Le volume dans le lecteur D n'a pas de nom
     Le numéro de série du volume est 2C1B-17DA
     
    Répertoire de D:\DEVLOPEZ\V\Vince3320
     
    .              <REP>        07/04/04  12:55 .
    ..             <REP>        07/04/04  12:55 ..
    MAKEFILE               962  07/04/04  13:39 makefile
    EXE            <REP>        07/04/04  13:08 EXE
    OBJ            <REP>        07/04/04  13:00 OBJ
    INCLUDE        <REP>        07/04/04  13:08 INCLUDE
    SRC            <REP>        07/04/04  13:00 SRC
    DIR      TXT             0  07/04/04  13:40 dir.txt
             2 fichier(s)                962 octets
     
    Répertoire de D:\DEVLOPEZ\V\Vince3320\EXE
     
    .              <REP>        07/04/04  13:08 .
    ..             <REP>        07/04/04  13:08 ..
    PLOP     EXE        65 802  07/04/04  13:39 plop.exe
             1 fichier(s)             65 802 octets
     
    Répertoire de D:\DEVLOPEZ\V\Vince3320\INCLUDE
     
    .              <REP>        07/04/04  13:08 .
    ..             <REP>        07/04/04  13:08 ..
    PLOP     H              89  07/04/04  13:13 plop.h
             1 fichier(s)                 89 octets
     
    Répertoire de D:\DEVLOPEZ\V\Vince3320\OBJ
     
    .              <REP>        07/04/04  13:00 .
    ..             <REP>        07/04/04  13:00 ..
    MAIN     OBJ         1 526  07/04/04  13:31 main.obj
    PLOP     OBJ         1 880  07/04/04  13:31 plop.obj
             2 fichier(s)              3 406 octets
     
    Répertoire de D:\DEVLOPEZ\V\Vince3320\SRC
     
    .              <REP>        07/04/04  13:00 .
    ..             <REP>        07/04/04  13:00 ..
    PLOP     C             115  07/04/04  13:14 plop.c
    MAIN     C              93  07/04/04  13:14 Main.c
             2 fichier(s)                208 octets
     
    Nombre total de fichiers listés :
             8 fichier(s)             70 467 octets
            14 répertoire(s)          925.10 Mo libre
    Attention . DOS/Windows n'étant pas 'case sensitive', il faut être plus rigoureux que moi avec les noms de fichiers si tu es sous Unixoide.

    Il doit y a voir moyen de faire mieux concernant les lignes de dépendances des fichiers source. A voir avec les spécialistes des outils en général et de 'make' en particulier.

    NOTA : La syntaxe de l'outil 'make' n'est pas standard.

  6. #6
    Membre éprouvé

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Par défaut
    Citation Envoyé par vince3320
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    plop.o : $(SRCPATH)plop.c $(SRCPATH)plop.h
    main.o : $(SRCPATH)main.c $(SRCPATH)plop.h
    et maintenant, il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    make: *** Pas de règle pour fabriquer la cible `obj/main.o', nécessaire pour `plop'. Arrêt.
    snif
    ze comprends rien la...
    Dans les deux lignes ci-dessus, tu lui donne les dépendances, c'est-à-dire que tu lui dis :
    il faut refaire plop.o quand plop.c ou plop.h ont changés (c'est-à-dire sont plus récent).
    Mais comme l'ont dit les autres, tu ne lui dis pas comment fabriquer les .o. Si tu ne veux pas mettre la commande pour chaque fichier comme dans les solutions qui t'ont été données, tu peux écrire une règle générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(OBJPATH)%.o : $(SRCPATH)%.c
         $(CC) -c $(CFLAGS) $< -o $@
    qui lui dit : SI tu veux construire un $(OBJPATH)toto.o ET que tu as un $(SRCPATH)toto.c, ALORS voilà la commande à appliquer.
    Attention, ça ne lui dit pas ce qu'il faut faire, et ça ne remplace donc pas les lignes que tu avais écrites.

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