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 :

Problème d'un Makefile complexe erroné


Sujet :

Systèmes de compilation

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Problème d'un Makefile complexe erroné
    Comme le problème ne venais pas du Shell, je reprends ici la discussion intitullée « Problème lancement Makefile dans Shell ».

    J'ai un Makefile qui ne fonctionne pas !

    En premier lieu, mon arborescence disque :

    Code du projet « sample » : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sample/
     |__ src/
     |    |__ liste.c
     |    |__ main1.c
     |__ inc/
     |    |__ liste.h
     |__ Makefile

    Puis les sources :

    Code du fichier « liste.c » : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
    void
    world (void)
    {
        printf (" World\n");
    }

    Code du fichier « main1.c » : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    #include "liste.h"
    int main (void)
    {
        printf ("Hello ");
        world ();
        return 0;
    }

    Code du fichier « liste.h » : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void world (void);

    Code du fichier « Makefile » : 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
    50
    51
    52
     
    # Makefile
     
    # Répertoires de travail :
    SRC = ./src
    INC = ./inc
    OBJ = ./obj
    LIB = ./lib
    BIN = ./bin
     
    # Nom des fichiers à générer
    OBJ_FILES = $(OBJ)/liste.o $(OBJ)/main1.o
    LIB_FILES = $(LIB)/liste.a
    EXE_FILES = $(BIN)/main1.exe
     
    # Compilateur C Ansi
    CC = @gcc
    AR = @ar -r
    RM_FILES = @rm -f $(OBJ)/* $(LIB)/* $(BIN)/*
    # */
    RM_FOLDERS = @rmdir $(OBJ)/ $(LIB)/ $(BIN)/
    ECHO = @echo
     
    # Flags de compilation / débug / warning
    CFLAGS = -Wall -W -pedantic -pedantic-errors -ansi -O2 -I$(INC)
     
    # Crée les dossiers et compile les fichiers sources nécessaires pour créer l'exécutable
    all: $(OBJ) $(LIB) $(BIN) $(OBJ_FILES) $(LIB_FILES) $(EXE_FILES)
     
    $(OBJ) $(LIB) $(BIN):
            @mkdir $@
     
    $(OBJ)/%.o : $(SRC)/%.c
            $(CC) $(CFLAGS) -c $< -o $@
     
    $(LIB)/%.a : $(OBJ)/%.o
            $(AR) $@ $<
     
    $(BIN)/%.exe : $(OBJ)/%.o
            $(CC) -o $@ $< $(LIB_FILES)
            $(ECHO) " ----- Programme compilé ----- "
     
    # Lance le programme
    start: all
            $(ECHO) " ----- Lancement du programme ----- "
            @$(EXE_FILES)
     
    # Détruit tout les fichiers créés par all
    clean:
            $(RM_FILES)
            $(RM_FOLDERS)
            $(ECHO) " ----- Environnement nettoyé ----- "

    Et voici les résultats sous AIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ make all
    make: 1254-002 Cannot find a rule to create target ./obj/liste.o from dependencies.
    Stop.
    $


    Je ne vois vraiment pas pourquoi ce Makefile ne fonctionne pas

    Qui peut m'aider ?

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    créer le répeertoire obj
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  3. #3
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par hiko-seijuro
    créer le répeertoire obj
    Yes ! Ca marche !

    Mais comment se fait-il qu'il ne le crée pas !
    Il y a bien la règle que le crée pourtant ?

  4. #4
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    tu as la règle pour créer le fichier qui est dans le répertoire. Mais il ne trouve pas le répertoire. Il ne peut donc pas vérifier si le fichier existe
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  5. #5
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par hiko-seijuro
    tu as la règle pour créer le fichier qui est dans le répertoire. Mais il ne trouve pas le répertoire. Il ne peut donc pas vérifier si le fichier existe
    Effectivement, tout ça est logique !
    Mais je ne l'avais pas comprise....

    Merci.

  6. #6
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Maintenant, je veux faire la même chose, mais ici les fichiers sources « .c » sont éventuellement compressés (commande « compress » et extension « .Z ») !

    Dans mon cas, « liste.c » n'est pas compressé (c'est compress qui décide !)) car aucun gain de taille, alors que « main1.c » est compressé.

    Par conséquent, voici le nouveau Makefile :

    Code du fichier « Makefile » : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    # Makefile
     
    # Répertoires de travail :
    SRC = src
    INC = inc
    OBJ = obj
    LIB = lib
    BIN = bin
     
    # Nom des fichiers à générer
    OBJ_FILES = $(OBJ)/liste.o $(OBJ)/main1.o
    LIB_FILES = $(LIB)/liste.a
    EXE_FILES = $(BIN)/main1
     
    # Compilateur C Ansi
    CC = @gcc
    AR = @ar -r
    RM_FILES = @rm -f $(OBJ)/* $(LIB)/* $(BIN)/*
    # */
    RM_FOLDERS = @rmdir $(LIB)/ $(BIN)/
    ECHO = @echo
     
    # Flags de compilation / débug / warning
    CFLAGS = -Wall -W -pedantic -pedantic-errors -ansi -O2 -I$(INC)
     
    # Crée les dossiers et compile les fichiers sources nécessaires pour créer l'exécutable
    all: $(LIB) $(BIN) $(OBJ_FILES) $(LIB_FILES) $(EXE_FILES)
     
    $(LIB) $(BIN):
        @mkdir $@
     
    $(SRC)/%.c : $(SRC)/%.Z
        @uncompress $(SRC)/*.Z
    # */
     
    $(OBJ)/%.o : $(SRC)/%.c
        $(CC) $(CFLAGS) -c $< -o $@
     
    $(LIB)/%.a : $(OBJ)/%.o
        $(AR) $@ $<
     
    $(BIN)/% : $(OBJ)/%.o
        $(CC) -o $@ $< $(LIB_FILES)
        $(ECHO) " ----- Programme compilé ----- "
     
    # Lance le programme
    start: all
        $(ECHO) " ----- Lancement du programme ----- "
        @$(EXE_FILES)
     
    # Détruit tout les fichiers créés par all
    clean:
        $(RM_FILES)
        $(RM_FOLDERS)
        @compress $(SRC)/*.c
        # */
        $(ECHO) " ----- Environnement nettoyé ----- "

    Mais hélas, ça ne marche de nouveau pas !!!
    J'obtiens ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ /usr/bin/make all
    make: 1254-002 Cannot find a rule to create target obj/liste.o from dependencies.
    Stop.
    $
    Et je ne comprends pas pourquoi ?

  7. #7
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut
    Je dois reprendre ce problème que j'ai du mettre de coté quelque temps.

    Et je ne vois toujours pas pourquoi ça ne fonctionne pas !

    Quelqu'un a-t-il une idée ?

Discussions similaires

  1. Réponses: 24
    Dernier message: 24/07/2007, 17h48
  2. Problème de compilation makefile
    Par julien.63 dans le forum C
    Réponses: 2
    Dernier message: 29/05/2007, 08h31
  3. Problème definitions multiple (Makefile?)
    Par zuzuu dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 07/12/2006, 14h18
  4. problème avec perl Makefile.PL
    Par flores dans le forum Modules
    Réponses: 2
    Dernier message: 30/10/2005, 19h09
  5. [MAKE] problème export sur makefile recursif
    Par tomasha dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 07/10/2005, 19h08

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