Comment utiliser exactement un makefile?

Je suis vraiment confus pour le moment.

J’ai donc 5 fichiers: main.c, flight.c, flight.h, passager.c et passager.h

flight.h a des prototypes de fonction pour flight.c, et passagers.h a des prototypes de fonctions pour passager.c

flight.c et passagers.c ont des définitions pour ces fonctions.

main.c est le programme avec lequel je vais interagir, appelant des fonctions des deux fichiers .c

Je ne suis pas sûr de savoir à quoi servent les fichiers .o. Quelqu’un veut-il bien expliquer? Voici mon Makefile:

flight.o: flight.c flight.h gcc -Wall -g -c flight.c passenger.o: passenger.c passenger.o gcc -Wall -g -c passenger.c main.o: main.c gcc -Wall -g -c main.c reservations.out: main.o flight.o passenger.o gcc -Wall -g flight.o passenger.o main.o -o reservations.out 

EDIT: J’utilise ensuite la commande “make Makefile” et j’obtiens une erreur: make: rien à faire pour `Makefile ‘.

Dans mon dossier, il y a un onglet avant gcc. J’apprécierais toute aide, je suis sûr que je fais mal de nombreuses choses. Merci.

Votre problème est que vous utilisez la mauvaise commande. J’appendais la ligne suivante en haut de votre makefile:

 all: reservations.out 

Ensuite, tapez simplement make sur la ligne de commande. Si vous ne voulez pas éditer le fichier, utilisez juste make reservations.out et vous devriez avoir le bon comportement.

Quant à ce qu’est un fichier .o : c’est un fichier ‘object’, ce qui signifie qu’il contient du code compilé (mais non lié dans ce cas). Votre règle de makefile finale prend les fichiers objects et les relie entre eux dans un exécutable final appelé reservations.out .

Maintenant que je le regarde un peu plus, il semble que vous ayez un comportement étrange dans votre règle finale. Je pense que cela devrait ressembler davantage à:

 reservations.out: main.o flight.o passenger.o gcc -Wall -g main.o flight.o passenger.o -o reservations.out 

De plus, vous avez passenger.o tant que condition préalable de passenger.o , ce qui vous causera certainement des problèmes. Ce que je ferais est quelque chose comme ceci (ça pourrait être encore plus serré, mais j’essaie de rendre ça simple):

 .PHONY: all clean all: reservations.out flight.o: flight.c flight.h gcc -Wall -g -c flight.c passenger.o: passenger.c passenger.h gcc -Wall -g -c passenger.c main.o: main.c gcc -Wall -g -c main.c reservations.out: main.o flight.o passenger.o gcc -Wall -g main.o flight.o passenger.o -o reservations.out clean: rm -f *.o reservations.out 

Mais ce que je ferais vraiment , si vous voulez entrer un peu plus dans les détails, est ci-dessous. C’est peut-être un peu exagéré pour un projet aussi petit, mais il est également plus facile d’ajuster et de jouer au violon au besoin.

 .PHONY: all clean BIN = reservations OBJ = flight.o passenger.o main.o all: $(BIN) %.o: %.c %.h gcc -Wall -g -c $< main.o: main.c gcc -Wall -g -c $< $(BIN): $(OBJ) gcc -Wall -g -o $@ $^ clean: rm -f $(OBJ) $(BIN) 

Je recommande de consulter le manuel de GNU make pour en savoir plus sur toutes les choses fantaisistes que vous pouvez faire.

Je ne suis pas sûr de savoir à quoi servent les fichiers .o. Quelqu’un veut-il bien expliquer?

Les fichiers .o sont des fichiers objects, les fichiers temporaires créés par le compilateur, qui contient le code object de la classe. Les codes d’object seront liés par l’éditeur de liens pour créer un fichier binary exécutable.

make a des règles implicites pour créer des fichiers binarys à partir de sources C, vous n’avez pas besoin de spécifier de règles explicites pour cela.

Donc, votre Makefile minimaliste ressemblerait à

 CFLAGS = -Wall -g .PHONY all clean all: myprogram myprogram: source1.c source2.c clean: rm -f myprogram 

Il a un effet secondaire utile: tous les fichiers intermédiaires (les fichiers *.o dans votre cas) seront automatiquement supprimés après la compilation.

Les options de CFLAGS seront ajoutées à la ligne de commande gcc – la règle implicite le fait.