Pages : 1
#1 Le 13/12/2007, à 22:02
- AuraHxC
Makefile
Voilà , j'ai déjà posté cette question sur d'autre forum et j'ai l'impression que personne ne sait réellement comment le faire de façon simple.
Je veux faire un makefile assez générique qui me permet de compiler mes projets C qui comporte toujours la même structure de dossier : bin, headers, src, obj
J'arrive très bien a compiler en cherchant mes .h dans headers et mes .c dans src et générer mon exécutable dans bin.
Mais malheureusement, je n'arrive pas a générer mes fichier objet (.o) dans mon dossier obj => il les mets toujours dans le repertoire courant du makefile.
CC=gcc
CFLAGS=-Wall -std=c99 -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized -Wunreachable-code -Wno-missing-braces -Wno-missing-field-initializers -Iheaders
LDFLAGS=-Wall -lm
EXEC=bin/Bataille
VPATH=src
vpath %.h headers
SRC=$(wildcard src/*.c)
OBJ=$(notdir $(SRC:.c=.o))
Bataille: $(OBJ)
@ $(CC) -o $(EXEC) $(OBJ) $(LDFLAGS)
@echo creation de lien
%.o: %.c
@ $(CC) -c $< $(CFLAGS)
@echo creation de $@
.PHONY: clean mrproper
@echo suppression de tous les fichiers.
mrproper: clean
@ rm -f $(EXEC)
@echo suppression executable
clean:
@ rm -f *.o
@echo suppression des fichiers objets
En espérant qu'il y est quelqu'un qui maà®trise les makefiles
Hors ligne
#2 Le 13/12/2007, à 22:22
- JBF
Re : Makefile
Et si au lieu de
%.o: %.c
tu mettais :
obj/%.o: %.c
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#3 Le 13/12/2007, à 22:39
- AuraHxC
Re : Makefile
j'avais déjà tenter mais ca changeait rien lol => le pire c'est que ca compile mes les .o sont toujours dans le dossier courant.
C'est quand même bizarre que personne n'a un makefile qui puisse faire ca
Hors ligne
#4 Le 13/12/2007, à 22:48
- JBF
Re : Makefile
Justement les makefiles que je faits placent bien les .o dans le répertoire que je veux, en faisant comme je te l'ai indiqué.
En revanche pour la compilation j'ai plutà´t quelque chose d'équivalent à
$(CC) $(CFLAGS) -o $@ -c $<
Moi c'est du fortran mais c'est toujours gcc.
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#5 Le 13/12/2007, à 23:02
- scholi
Re : Makefile
c'est normal, tu précise pas o๠il doit mettre les .o:
@ $(CC) -c $< $(CFLAGS)
il faur rajouter l'option -o
$(CC) -c -o path/$@ $< $(CFLAGS)
Dernière modification par scholi (Le 13/12/2007, à 23:03)
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
#6 Le 13/12/2007, à 23:31
- AuraHxC
Re : Makefile
l'option -o c'est pour générer l'exécutable pas les .o => pour ca j'utilise -c qui génère les .o
Hors ligne
#7 Le 13/12/2007, à 23:46
- robrob
Re : Makefile
-o c'est le nom du fichier de sortie (qui n'est donc pas nécessaire un executable).
Dernière modification par robrob (Le 13/12/2007, à 23:47)
Hors ligne
#8 Le 14/12/2007, à 05:48
- JBF
Re : Makefile
l'option -o c'est pour générer l'exécutable pas les .o => pour ca j'utilise -c qui génère les .o
Mais non, -o c'est l'option pour imposer le nom du produit de la commande (-o : output)
-c c'est pour compilation seule, donc production des fichiers objets seulement.
S'il n'y a pas -c, gcc compile ce qui doit l'être puis lance aussi l'édition de lien, donc la création de l'exécutable ou de la bibliothèque.
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#9 Le 14/12/2007, à 13:39
- scholi
Re : Makefile
exacte! -o spécifie simplement le nom de sortie (rien à voir avec l'exécutable).
Donc le code que je t'ai donné plus haut marche très bien.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
#10 Le 14/12/2007, à 16:09
- AuraHxC
Re : Makefile
Oki !!! effectivement j'ai dit une bêtise
Bon ca me redirige bien mes .o dans mon dossier par contre maintenant il les récupère pas, je mets le make et l'erreur que ca me retourne.
CC=gcc
CFLAGS=-Wall -std=c99 -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized -Wunreachable-code -Wno-missing-braces -Wno-missing-field-initializers -Iheaders
LDFLAGS=-Wall -lm
EXEC=bin/Bataille
VPATH=src
vpath %.h headers
SRC=$(wildcard src/*.c)
OBJ=$(notdir $(SRC:.c=.o))
Bataille: $(OBJ)
@ $(CC) -o $(EXEC) $(OBJ) $(LDFLAGS)
@echo creation de lien
%.o: %.c
@ $(CC) -c -o obj/$@ $< $(CFLAGS)
@echo creation de $@
.PHONY: clean mrproper
@echo suppression de tous les fichiers.
mrproper: clean
@ rm -f $(EXEC)
@echo suppression executable
clean:
@ rm -f $(OBJ)
@echo suppression des fichiers objets
nicolas@nicolas-laptop:~/Programmation/C/Projet/Version0.1$ make
creation de carte.o
creation de couleur.o
creation de jeu.o
creation de test.o
creation de valeur.o
gcc: carte.o: No such file or directory
gcc: couleur.o: No such file or directory
gcc: jeu.o: No such file or directory
gcc: test.o: No such file or directory
gcc: valeur.o: No such file or directory
make: *** [Bataille] Error 1
Hors ligne
#11 Le 14/12/2007, à 16:12
- JBF
Re : Makefile
Ben il faut corriger ta variable OBJ maintenant pour dire au linker o๠sont les fichiers objets.
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#12 Le 14/12/2007, à 17:22
- scholi
Re : Makefile
pour ne pas pas changer le nom partout, je te conseil de faire un Makefile par dossier et qu'ils s'appelent les uns les autres:
cd obj && make
Dernière modification par scholi (Le 14/12/2007, à 17:23)
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
Pages : 1