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

C Discussion :

Créer un makefile en séparant les sources et les objets


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut Créer un makefile en séparant les sources et les objets
    Bonjour

    J'aimerais organiser mon code en séparant les sources et les fichiers objets.

    J'aimerais que mon code soit dans un dossier dans lequel on trouve le makefile et l'exécutable. Ce dossier contiendrait un dossier "obj" et un dossier "src" qui contient les fichier .c et .h .

    Pour l'instant avec mon makefile il faut que je le place dans le dossier src pour que ça marche.

    Voici 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
    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
    59
     
    # -------------------------------------------------------------------
    #
    #   makefile 
    #
    # -------------------------------------------------------------------
     
    # nom de l'executable :
    EXECUTABLE=cargol
     
    # choix du compilateur :
    COMPILATEUR=gcc
     
    # options compilations (-lm pour math.h) :
    OPTIONS=-c -O3 -Wall -Wextra 
     
    # liste de tous les objets :
    OBJ=	brownien.o \
    	init_calcul.o \
    	dynamique.o \
    	positionNVE.o \
    	voisin.o \
    	vitesseNVE.o \
    	vitesse_langevin.o \
    	force_ene.o \
    	periodic_cond.o \
    	moyenne.o \
    	gaussienne.o \
    	print.o \
    	free.o \
    	main.o
     
    # commande par defaut
    all: install
     
    # édition de lien de tous les objets (-lm pour la lib math.h)
    install: $(OBJ) 
    	$(COMPILATEUR) $(OBJ) -o $(EXECUTABLE) -lm 
    	mv $(EXECUTABLE) ../
    	mv *.o ../obj/
     
    # on compile tous les fichiers sources :
    %.o: %.c
    	$(CC) $(OPTIONS) $*.c
     
    # liste de toutes les dependences :
    init_calcul.o: main.h
    init_calcul.o: variables_globales.h
    init_calcul.o: gaussienne.o
     
    ... bla bla bla
     
    dynamique.o: main.h
    dynamique.o: extern.h
     
    # pour effacer tous les objet
    .PHONY: clean
    clean:
    	rm -rf ../obj/*.o
    Si vous avez aussi un solution pour mettre les .h dans un dossier include je suis prenneur

    Merci pour votre aide.

  2. #2
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Dans le cas de projets ponctuels pas trop complexes, j'ai l'habitude de sortir mon Makefile de poche :

    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
     
    ##### Variables
     
    SRCDIR = ../src
    INCDIR = -I/usr/include -I../include -I../src
    CPPFLAGS = -O2 -fno-strength-reduce -W -Wall -pedantic -ansi $(INCDIR) 
    #CPPFLAGS = -g -W -Wall -pedantic -ansi $(INCDIR) 
    LFLAGS = -lm
    CC = g++
     
    ##### Fichiers
     
    SOURCES = $(wildcard *.cpp)
    OBJETS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
    CIBLE = mon_executable
     
    ##### Regles de construction
     
    all: $(OBJETS)
    	$(CC) $(CPPFLAGS) $(OBJETS) $(LFLAGS) -o $(CIBLE)
     
    import:
    	@rm -f *.cpp *~
    	@for dir in $(SRCDIR); do find $$dir -name \*.cpp -exec ln -s {} \; ; done
     
    depend:
    	@makedepend $(INCDIR) -Y -m $(SOURCES) 2> /dev/null
     
    clean:
    	@rm -f *.o *.bak *~ *%
    Il va de paire avec la structure de fichiers suivante, laquelle peut être facilement paramétrée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    project
        +-- code (ou build ou autre selon mon humeur)
               +-- Makefile
        +-- src
              +-- truc
                    +-- machin
                          +-- bidule.cpp
                          +-- bidule.hpp
        +-- include
               +-- project
                     +-- api.hpp
    Les deux cibles "import" et "depend" servent respectivement à récupérer les sources dans le dossier courant (avec des liens symboliques) et à générer les dépendances entre fichiers cpp et fichiers d'entête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ cd project/code
    $ make import
    $ make depend
    $ make

  3. #3
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Je comprend pas ton makefile de poche ...

    Etant donné ta structure, si tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOURCES = $(wildcard *.cpp)
    il ne devrais rien trouvé vu que le dossier code ne contient que ton exécutable et le makefile.

    Si tu peux commenter un peu plus ton code ou me proposer quelque chose qui s'adapte au mien je te remercie d'avance.

  4. #4
    Membre éprouvé
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    J'ai essayé ce code, en récupérant des choses que tu as faites mais il ne marche pas. Dans SRC les sources sont enregistée comme /src/gaussienne.c, du coup les objet sont /obj/src/gaussienne.o.

    Je ne sais pas subtituer le src par obj au lieu de rajouter obj devant src.

    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
    50
    51
    52
    53
    54
    55
     
    # nom de l'executable :
    EXECUTABLE = cargol
     
    # dossier contenant les fichiers sources
    SRC_DIR = ./src/
     
    # dossier contenant les fichiers objets
    OBJ_DIR = ./obj/
     
    # choix du compilateur :
    COMPILATEUR = gcc
     
    # options compilations :
    OPTIONS = -c -O3 -Wall -Wextra 
     
    # listes des fichiers sources
    SRC = $(wildcard $(SRC_DIR)*.c)
     
    # liste des fichiers objets
    OBJ = $(patsubst %.c, %.o, $(SRC))
     
    # dossier contenant les include
    # H_DIR = ./include/
    # INCLUDE= -I$(H_DIR)
     
    # les objets sont dans OBJ_DIR
    vpath .o $(OBJ_DIR)
     
    # commande par defaut
    all: install
     
    # édition de lien de tous les objets (-lm pour la lib math.h)
    install: $(OBJ) 
    	$(COMPILATEUR) $(OBJ) -o $(EXECUTABLE) -lm 
    	mv $(EXECUTABLE) ../
    	mv *.o ../obj/
     
    # on compile toutes les sources
    # les fichier objet sont dans DIROBJ
    $(OBJ): $(SRC)
    	$(CC) $(OPTIONS) $@ -o $(OBJ_DIR)$*.o
     
    # liste de toutes les dependences :
    init_calcul.o: main.h
    init_calcul.o: variables_globales.h
    init_calcul.o: gaussienne.o
    init_calcul.o: force_ene.o
    init_calcul.o: print.o
     
    main.o: main.h
    main.o: extern.h
    main.o: brownien.o
    main.o: dynamique.o
    main.o: init_calcul.o

  5. #5
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    J'ai remanié mon Makefile pour coller à tes besoins. La structure du projet change donc de la manière suivante (en rouge les éléments créés automatiquement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    project
        Makefile
        run
        +-- build
        +-- src
              +-- truc
                    +-- machin
                          +-- bidule.c
                          +-- bidule.h
        +-- include
               +-- project
                     +-- api.h
    Rappel : make import && make depend && make

    Code Make : 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
     
    ##### Settings
     
    SRCDIR = src
    BUILDDIR = build
    TARGET = run
     
    INCDIR = -I/usr/include -I$(SRCDIR) -Iinclude
    #CPPFLAGS = -O2 -fno-strength-reduce -W -Wall -pedantic -ansi $(INCDIR) 
    CPPFLAGS = -g -W -Wall -pedantic -ansi $(INCDIR) 
    LFLAGS = -lm
    CC = g++
     
    ##### Files
     
    SOURCES = $(wildcard $(BUILDDIR)/*.c)
    OBJECTS = $(patsubst %.c,%.o,$(SOURCES))
     
    ##### Build rules
     
    .PHONY: all import depend clean
     
    all: $(OBJECTS)
    	$(CC) $(CPPFLAGS) $(OBJECTS) $(LFLAGS) -o $(TARGET)
     
    import: clean
    	@mkdir -p $(BUILDDIR)
    	@for dir in $(SRCDIR); do find $$dir -name \*.c -exec sh -c 'exec ln -s ../"$$1" $(BUILDDIR)/`basename "$$1"`' zorglub {} \; ; done
     
    depend:
    	@makedepend $(INCDIR) -Y -m $(SOURCES) 2> /dev/null
     
    clean:
    	@rm -f $(BUILDDIR)/*
    	@rm -f Makefile.bak
    	@rm -f $(TARGET)
     
    ##### End of Makefile

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/07/2011, 12h31
  2. [XL-2003] Remplacer les noms et les sources des contrôles d'un userform
    Par MarcelG dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/02/2010, 17h55

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