2009-12-03 9 views
1

Je suis vraiment confus pour le moment.Comment utiliser un makefile exactement?

J'ai 5 fichiers: main.c, flight.c, flight.h, passenger.c et passenger.h

flight.h a des prototypes de fonction pour flight.c et passenger.h a prototypes de fonction pour le passager.c

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

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

Je ne suis pas vraiment sûr de ce que les fichiers .o sont pour, quelqu'un s'il vous plaît prendre soin d'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 obtenir une erreur: faire: Rien à faire pour `Makefile ».

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

+0

Votre éditeur convertit-il les onglets en espaces? Il doit être un caractère de tabulation. – asveikau

+0

semble avoir été converti en espaces après avoir décoché l'option use spaces, je vérifie – kevin

+2

ne pas taper 'make Makefile', tapez 'make reservations.out'. –

Répondre

10

Votre problème est que vous utilisez la mauvaise commande. Je voudrais ajouter la ligne suivante en haut de votre makefile:

all: reservations.out 

Ensuite il suffit de taper make à la ligne de commande. Si vous ne voulez pas modifier le fichier, utilisez simplement make reservations.out et vous devriez avoir le bon comportement. En ce qui concerne le fichier .o: c'est un fichier 'objet', c'est-à-dire qu'il contient un code compilé (mais pas lié dans ce cas). Votre règle finale de makefile prend les fichiers d'objet et les lie ensemble dans un exécutable final appelé reservations.out.

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

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

En outre, vous avez passenger.o comme condition sine qua non de passenger.o, ce qui est sûr va vous causer des problèmes. Ce que je voudrais faire est quelque chose comme ça (il pourrait être encore plus serré, mais je suis en train de faire de ce 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 vraiment faire, si vous voulez obtenir un peu plus dans les détails, est ci-dessous. Il est peut-être un peu exagéré pour un si petit projet, mais il est aussi plus facile de le modifier et de le modifier 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 [email protected] $^ 

clean: 
    rm -f $(OBJ) $(BIN) 

Je recommande de vérifier le GNU make manual pour en savoir plus sur tous les trucs de fantaisie que vous pouvez faire.

+0

En outre, je reçois ce message: "make: Circular passenger.o <- passager.o dépendance a chuté." Est-ce important? C'est juste une règle que je ne suis pas censé avoir des avertissements alors je me demande de quoi parle ce message. – kevin

+0

Ce message est parce que vous avez passager.o comme prérequis (côté droit d'une règle) pour lui-même. –

+0

merci, mon erreur. – kevin

2

I'm not really sure what .o files are for, somebody please care to explain?

0o sont des fichiers objets, les fichiers temporaires créés par le compilateur, qui contiennent le code objet de la classe. Les codes d'objet seront liés par l'éditeur de liens pour créer un fichier binaire exécutable.

+0

Alors, comment savoir combien de fichiers .o j'ai besoin? – kevin

+0

Je suppose qu'il y en a un pour chaque fichier .cpp –

+0

quelqu'un s'il vous plaît corrigez-moi, si je me trompe, je suis Windows gars et ne pas écrire makefiles. –

1

make possède des règles implicites pour faire des binaires en source C, vous n'avez pas besoin de spécifier des règles explicites pour cela.

donc votre Makefile minimalistes 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 (*.o fichiers dans votre cas) seront supprimés automatiquement après la compilation.

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

Questions connexes