2017-08-29 5 views
0

Ich habe diese Dateien main.c, fun.c und fun.h. Ich möchte makefile Skript anstelle von herkömmlichen kompilierenden Ansatz ausführen. Derjenige, der das folgende Makefile-Skript gepostet hat, sagte, dass dieses Skript automatisch die Dateinamen im selben Verzeichnis erfassen würde, also brauche ich nur zum Projektverzeichnis zu gehen und in das Terminal $ make zu schreiben. Ich habe eine Datei makefile und setzen Sie das folgende Skript:Makefile Skript läuft nicht richtig

TARGET = prog 
LIBS = -lm 
CC = gcc 
CFLAGS = -g -Wall 

.PHONY: default all clean 

default: $(TARGET) 
all: default 

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c)) 
HEADERS = $(wildcard *.h) 

%.o: %.c $(HEADERS) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

.PRECIOUS: $(TARGET) $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(OBJECTS) -Wall $(LIBS) -o [email protected] 

clean: 
    -rm -f *.o 
    -rm -f $(TARGET) 

Allerdings bekomme ich diesen Fehler: make: *** No rule to make target default‘.

Stop.`

Ich versuchte $make -v und bekam:

GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for i386-apple-darwin11.3.0 

Ich glaube, ich ihn falsch verstanden! Bitte, was fehlt hier? Vielen Dank

+0

Makefiles sind ** nicht ** Skripte ... und ich würde sie sehr ** traditionell verwenden (aber Ihr Ansatz, nur etwas zu kompilieren mit dem Namen '* .c' ist definitiv nicht sehr traditionell ...) –

+0

Ihr 'Default'-Ziel, das in diesem Makefile überhaupt keinen Zweck erfüllt, hat keinen Zweck. Warum schreibst du nicht einfach "all: $ (TARGET)" als erste Regel? –

+2

Es scheint mir korrekt zu sein, denken Sie daran, dass in Makefile diese Leerzeichen (4 Leerzeichen in der Sequenz) müssen Tabs ('\ t') sein. – Amadeus

Antwort

2

Der fehlende Separator Fehler ist, weil Sie keine Registerkarten für das "Rezept" verwenden.

Zum Beispiel hat Ihr TARGET-Ziel eine Voraussetzung von $ (OBJECTS), sobald Make weiß, dass es da ist (oder es macht), dann wird es zum Rezept weitergehen.

+0

Korrekt. Das habe ich auch gerade gesehen. Danke – Medo

+0

Kein Problem, ich hätte nur kommentiert, aber keine Wiederholung! Habe Spaß! –