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 à réaliser un Makefile


Sujet :

Systèmes de compilation

  1. #1
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut Problème à réaliser un Makefile
    Salut all,

    Bon alors voilà mon histoire:
    J'ai écris un Makefile de base pour mon projet, ce Makefile contient des commandes brutes pour compiler CHAQUE objet, bon il est pas très beau, et ca me gonfle d'avoir à le modifier à chaque fois que j'ajoute un nouveau fichier source.
    Pour être honnête je n'ai pas lu en profondeur un tutorial sur l'écriture de makefile avancé, pour cause de manque de temps. J'ai tellement des trucs en ce moment que je ne trouve même presque plus le temps de manger ^^
    Mais alors j'ai pensé au caractères '*' ah tiens essayant un Makefile:
    # compiler
    CC = gcc

    # sources
    SRC = ./src

    # objects
    OBJ = ./obj

    # headers
    HDR = ./include

    # binary
    BIN = ./bin

    # librarys
    LIB = -lmysqlclient -lz -lpthread

    CFLAGS = -Wall -O2 -g

    all: $(BIN)/pokerd

    $(BIN)/pokerd: $(OBJ)/*.o
    $(CC) -o $(BIN)/pokerd $(OBJ)/*.o $(LIB)

    $(OBJ)/*.o: $(SRC)/*.c $(HDR)/*.h
    $(CC) $(CFLAGS) -I$(HDR) -c $(SRC)/*.c $(OBJ)/*.o


    cleanobj:
    rm -rf $(OBJ)/*.o

    clean: cleanobj
    rm -rf $(BIN)/pokerd
    Mes codes sources sont étalés exactement comme le montre le makefile ce qui veut dire:
    include/ : tous les .h
    src/ : tous les .c
    obj/ : tous les .o compilés
    bin/ : le binaire final
    Bon ce Makefile ne fonctionne trop pas :/, j'ai directement une erreur:
    include/*.h: no such file or directory
    make error 1...
    Est-ce que j'ai fais n'importe quoi?
    Comment remédier à ça? (s'il vous plait ne me demandez pas de lire la doc sur make car croyez moi j'ai vraiment pas assez de temps pour le moment :/)

    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Normalement, on privilégie le fait de lister les sources une à une dans une variable mais bon essaie ceci. Si tu veux lister les sources, tu n'auras qu'à remplacer le wildcard par les sources que tu veux.

    Le plus compliqué est de lister les objets qui vont être générés dans $(OBJ). Je ne dois sûrement pas m'y prendre de la meilleure manière pour obtenir la liste des objets. Si quelqu'un a une meilleure solution, je suis preneur. Enfin, là déjà ça marche.

    Pour gérer les dépendances, j'utilise makedepend qui scanne les sources et écrit les dépendances à la fin du Makefile. Tu dois donc tout d'abord faire make depend (il y a bien un espace) pour lister les dépendances. A appeler aussi souvent que nécessaire. Ensuite, make à chaque fois que tu veux compiler et make clean si tu veux nettoyer.

    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
     
    # compiler
    CC = gcc
     
    # sources
    SRC = ./src
     
    # objects
    OBJ = ./obj
     
    # headers
    HDR = ./include
     
    # binary
    BIN = ./bin
     
    # librarys
    LIB = -lm
     
    CFLAGS = -Wall -O2 -g -I$(HDR)
     
    SOURCES= $(wildcard $(SRC)/*.c)
     
    # Convertit $(SRC)/%.c en $(SRC)/%.o
    OBJETS2= $(SOURCES:.c=.o)
    # Convertit $(SRC)/%.o en %.o
    OBJETS1= $(notdir $(OBJETS2))
    # Convertit %.o en $(OBJ)/%.o
    OBJETS= $(addprefix obj/, $(OBJETS1))
     
    all: $(BIN)/pokerd
     
    $(BIN)/pokerd: $(OBJETS)
    	$(CC) -o $(BIN)/pokerd $(OBJETS) $(LIB)
     
    $(OBJ)/%.o: $(SRC)/%.c
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    cleanobj:
    	rm -rf $(OBJ)/*.o
     
    clean: cleanobj
    	rm -rf $(BIN)/pokerd
     
    depend:
    	makedepend -I$(HDR) $(SRC)/*.c

  3. #3
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Merci mec ! Ca rox ^^
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. Problème d'un Makefile complexe erroné
    Par domiq44 dans le forum Systèmes de compilation
    Réponses: 6
    Dernier message: 18/10/2007, 09h12
  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