2016-07-17 19 views
0

ich zwei C-Quelldateien haben, prog2.c und getopts.c .My prog2.c und getopts.c Dateien verknüpft sind, zu jeder other.I die folgende Make-Datei von meiner Aufgabe gemacht Richtung:make: *** [clean] Fehler 1 und keine Regel Ziel Fehler machen

OPTS= -g -c -Wall -Werror 
efile = shell 
ofile = prog2.o getopts.o 
all: gcc -0 $(efile) <$(ofile)> 

shell: \ 
prog2.o getopts.o 
    gcc prog2.o getopts.o -o shell 

prog2.o: \ 
prog2.c 
    gcc $(OPTS) prog2.c 

getopts.o: \ 
getopts.c 
    gcc $(OPTS) getopts.c 

clean: 
    rm $(ofile) $(efile) 

die Richtung sagt: für die endgültige Verknüpfung muss ich gcc -o efile <ofiles> verwenden, wo efile ist die ausführbare Datei (ich glaube, dass hier shell wird) und ofiles ist die Liste aller .o Dateien. Dann wurde mir gesagt, Befehl make clean und make .Für die make clean Befehl bekomme ich den folgenden Fehler: kann nicht entfernen ... keine Datei oder Verzeichnis Fehler gefolgt von make:***[clean] Error 1. Wenn ich make Befehl, bekomme ich den folgenden Fehler: make: *** Keine Regel, um das Ziel 'gcc' zu machen, das von 'all' benötigt wird. Halt. Ich habe einige Webseiten und ähnliche Fragen durchgesehen, aber ich verstehe es wirklich nicht.

+0

die 'gcc -0 $ (efile ...' sollte in der nächsten Zeile sein, mit einer Registerkarte vor - wie es als Abhängigkeiten für 'all' verstanden wird und nicht als ein Befehl, um es zu bauen. Auch , das sollte "-o" nicht "-0" sein – Dmitri

+0

Ich habe aber immer noch denselben Fehler für den make clean-Befehl bekommen, und für makr bekomme ich einige neue Fehler wie: syntex error near expected token für den make-Befehl –

+0

Probieren Sie '$ (ofile)' anstelle von '<$(ofile)>' aus, und der Fehler 'make clean' liegt wahrscheinlich daran, dass die von Ihnen angegebenen Dateien nicht existieren (obwohl 'rm -f' anstatt nur' rm' loswerden sollte) der Fehler) – Dmitri

Antwort

1

Zuerst gehen die Befehle zum Erstellen eines Ziels in einer Make-Datei nicht in derselben Zeile wie der Zielname, sondern in den folgenden Zeilen mit einer Registerkarte vor jedem ... so dass die gcc -0 $(efile) <$(ofile)> in der falscher Ort.

Zweitens waren die spitzen Klammern in den Richtungen wahrscheinlich nicht wirklich in Ihrem Befehl angezeigt.

Wenn ein Ziel erfordert, dass zuerst andere Ziele erstellt werden, sollten diese Ziele als Abhängigkeiten nach dem Zielnamen aufgelistet werden, getrennt durch einen Doppelpunkt.

Und die Option zur Angabe der Ausgabedatei für gcc ist -o anstatt -0.

So Ihr all Ziel wird:

all: $(ofile) 
    gcc -o $(efile) $(ofile) 

Der Fehler bei der Ausführung von make clean aufgetreten, weil die Dateien, die es versucht, nicht zu löschen gibt, wie ein erfolgreicher Build nicht getan worden war. Das Hinzufügen der "force" -Option für rm bewirkt, dass "nicht vorhandene Dateien und Argumente ignoriert, nie aufgefordert" wird, so dass der Befehl auch dann erfolgreich ist, wenn die Dateien fehlen und make nicht klagen. Also das wird:

clean: 
    rm -f $(ofile) $(efile) 

Beachten Sie aber, dass in der Regel einzelne Programme und Bibliotheken mit dem Make-Datei aufgebaut haben jeweils ihre eigenen Ziele haben, und „alle“ in der Regel nur auf jeden von ihnen abhängt, so dass alle von ihnen gebaut werden ... Das "All" -Ziel zu verwenden, ist also etwas ungewöhnlich.