NAME = ft_cat
CC = gcc
SRCS = $(wildcard $(SRC_PATH)/*.c)
OBJ = $(SRCS:.C=.o)
CFLAGS = -Wall -Wextra -Werror
RM = rm -rf
SRC_PATH = srcs
HEAD_NAME = ft_cat.h
HEAD_PATH = includes
HEAD = $(addprefix $(HEAD_PATH)/, $(HEADNAME))
all : $(NAME)
$(NAME) : $(OBJ) $(HEAD)
$(CC) -o $@ $(OBJ) $(CFLAGS)
%.o : %.c
$(CC) -o $@ -c $< $(CFLAGS) -I $(HEADERS)
clean :
$(RM) $(OBJ)
fclean : clean
$(RM) $(NAME)
re : clean fclean
.PHONY : all clean fclean re
Bonjour ! J'ai un petit soucis de compréhension sur les headers dans les makefiles et je n'ai trouvé nul part la réponse sur internet du coup je viens demander de l'aide ... J'ai juste compris qu'il fallait ajouter -I et le dossier à inclure .
En gros je dois faire un makefile qui compile mes fichiers en .c qui sont dans le dossier "srcs" et mon fichier "ft_cat.h" qui se trouve dans le dossier includes.
Voilà mon code, et je me demandais s'il était nécessaire dans la ligne "$(NAME) : $(OBJ) $(HEAD)" d'ajouter le $(HEAD)
Dites moi ce que vous pensez de mon Makefile et s'il y a des modifications/ amélioration à faire ! Merci d'avance
Si tu peux utiliser autre chose que les Makefiles, se serait mieux. Écrire soi-même les relations .h/.c est contre-productif (les Makefile dispose quand même d'un moyen pour générer cette dépendance automatiquement).
Sinon 3 problèmes:
Un exécutable n'a aucune raison de dépendre d'un .h, les .o dépendent des .c et .h. Ton utilisation de $(HEAD) est au mauvais endroit.
La variable HEADERS n'existe pas, tu voulais probablement mettre HEAD_PATH
C'est étrange de mettre un C majuscule dans le pattern de remplacement pour OBJ alors que tu utilises un wildcard de .c (donc minuscule)
Si tu peux utiliser autre chose que les Makefiles, se serait mieux. Écrire soi-même les relations .h/.c est contre-productif (les Makefile dispose quand même d'un moyen pour générer cette dépendance automatiquement).
Sinon 3 problèmes:
Un exécutable n'a aucune raison de dépendre d'un .h, les .o dépendent des .c et .h. Ton utilisation de $(HEAD) est au mauvais endroit.
La variable HEADERS n'existe pas, tu voulais probablement mettre HEAD_PATH
C'est étrange de mettre un C majuscule dans le pattern de remplacement pour OBJ alors que tu utilises un wildcard de .c (donc minuscule)
C'est assez facile de faire une dépendance d'entête en faisant du pur make POSIX (compatible BSD et GNU). Il suffit d'utiliser -MMD avec gcc/clang.
SRCS= foo.c bar.c quux.c
OBJS= ${SRCS:.c=.o}
DEPS= ${SRCS:.c=.d}
all: main
.c.o:
${CC} ${CFLAGS} -MMD -c $< -o $@
# la magie ici
-include ${DEPS}
main: ${OBJS}
clean:
rm -f main ${OBJS} ${DEPS}
.PHONY: all clean
De ce fait, pendant la compilation le compilateur créé des fichiers .d compatible make qui contient les dépendance d'entête pour chaque fichier objet. Par conséquent make sait qui reconstruire si on modifie un entête.
Pour les projets simples, pas toujours besoin de sortir l'artillerie lourde que sont CMake, meson, autotools et autre. Make a l'avantage d'être un composant POSIX (à condition de faire du POSIX make, préférable).
- Edité par markand 16 juin 2021 à 10:22:39
git is great because Linus did it, mercurial is better because he didn't.
C'est assez facile de faire une dépendance d'entête en faisant du pur make POSIX (compatible BSD et GNU). Il suffit d'utiliser -MMD avec gcc/clang.
SRCS= foo.c bar.c quux.c
OBJS= ${SRCS:.c=.o}
DEPS= ${SRCS:.c=.d}
all: main
.c.o:
${CC} ${CFLAGS} -MMD -c $< -o $@
# la magie ici
-include ${DEPS}
main: ${OBJS}
clean:
rm -f main ${OBJS} ${DEPS}
.PHONY: all clean
De ce fait, pendant la compilation le compilateur créé des fichiers .d compatible make qui contient les dépendance d'entête pour chaque fichier objet. Par conséquent make sait qui reconstruire si on modifie un entête.
Pour les projets simples, pas toujours besoin de sortir l'artillerie lourde que sont CMake, meson, autotools et autre. Make a l'avantage d'être un composant POSIX (à condition de faire du POSIX make, préférable).
- Edité par markand il y a environ 3 heures
Ah c'est pas mal ça !! Mais je ne pense pas que j'ai le droit de l'utiliser :/ donc je vais rester sur ce que j'ai envoyé en dernier message (en tout cas pour ce que je dois rendre, je vais regarder ce que tu m'as envoyé ! )
Qu'est-ce que c'est cette raison de droit d'utiliser ?!
Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.
git is great because Linus did it, mercurial is better because he didn't.
Qu'est-ce que c'est cette raison de droit d'utiliser ?!
Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.
Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...
Qu'est-ce que c'est cette raison de droit d'utiliser ?!
Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.
Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...
Pourquoi utiliser un makefile alors...On peut compiler sans.
C'est juste un métalangage, on peut très bien compiler son c sans make...
Bref peut être cette page pourra t'aider, parce que si tu ne peux pas utiliser du Makefil POSIX, à vrai dire tu peux encore moins utiliser du Makefile pas POSIX, enfin ça parait être la vraie lignée.
Pour le printf tu peux le recoder par toi même à la limite si bon te semble. Même passer par de l'assembleur si ça augmente tes chances d'entrer en école, mais j'en doute un peu.
Après tout vouloir se passer de printf revient à se passer stdio.h...Un des includes les plus commun.
Donc tu lis le fichier stdio.h et tu te la recode à la main, façon à changer quelques paramètres...Pour les codes d'échappements et les métacaractères à la limite qui doivent sans doute être superflus.
dans le man stdio.h on retrouve le basique: les entrées/sorties. Et la définition de fonctions bien sûr.
Ben du coup je sais que je recommanderai jamais cette école à quiconque.
Pourquoi passer son permis sur une voiture récente quand on peut la passer sur un 4L.
Après on s'étonne qu'en arrivant en entreprise les élèves ne connaissent rien au Java 16, C11, C++23, C# 9, etc.
maroufle34 a écrit:
CNoéDormoy a écrit:
markand a écrit:
Qu'est-ce que c'est cette raison de droit d'utiliser ?!
Dans la vie on utilise ce qui est à disposition. Si on te demande de coder un snake graphique, sauf erreur de ma part tu vas utiliser des bibliothèques graphiques existantes pour ne pas tout réinventer.
Oui sauf que je vais passer 42 donc je n'ai pas le droit d'utiliser grand chose, par exemple en c on à pas le droit d'utiliser printf etc on doit tout refaire nous même ...
Pourquoi utiliser un makefile alors...On peut compiler sans.
C'est juste un métalangage, on peut très bien compiler son c sans make...
Bref peut être cette page pourra t'aider, parce que si tu ne peux pas utiliser du Makefil POSIX, à vrai dire tu peux encore moins utiliser du Makefile pas POSIX, enfin ça parait être la vraie lignée.
Pour le printf tu peux le recoder par toi même à la limite si bon te semble. Même passer par de l'assembleur si ça augmente tes chances d'entrer en école, mais j'en doute un peu.
Après tout vouloir se passer de printf revient à se passer stdio.h...Un des includes les plus commun.
Donc tu lis le fichier stdio.h et tu te la recode à la main, façon à changer quelques paramètres...Pour les codes d'échappements et les métacaractères à la limite qui doivent sans doute être superflus.
dans le man stdio.h on retrouve le basique: les entrées/sorties. Et la définition de fonctions bien sûr.
C'est juste pour la piscine d'entrée c'est pour bien comprendre comment tout marche je pense ! Après je pense qu'on va avoir le droit d'utiliser les printf etc.. :)
Ben du coup je sais que je recommanderai jamais cette école à quiconque.
Pourquoi passer son permis sur une voiture récente quand on peut la passer sur un 4L.
Après on s'étonne qu'en arrivant en entreprise les élèves ne connaissent rien au Java 16, C11, C++23, C# 9, etc.
D'un autre côté l'école 42 s'intéresse surtout à l'algorithmique...A vrai dire je ne m'y connais pas assez, surtout sur les entrées/sorties qui à nous programmeurs (enfin pas moi) de semi haut niveau (càd en C) n'auront jamais à utiliser du plus bas niveau que ça.
Makefile et Headers
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
git is great because Linus did it, mercurial is better because he didn't.
git is great because Linus did it, mercurial is better because he didn't.
git is great because Linus did it, mercurial is better because he didn't.
git is great because Linus did it, mercurial is better because he didn't.