Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 tongue

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 big_smile

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:

AuraHxC a écrit :

@ $(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

AuraHxC a écrit :

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 wink
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