Ich lerne C-Programmierung durch "Learn C the Hard Way". Ich bin momentan (für ziemlich lange Zeit) auf Übung 2, die hier zu finden ist: Ссылка
Im Abschnitt "extra credit" gibt es eine Aufforderung, das Makefile zu bearbeiten, so dass wir die .c-Datei (ex1.c) nur mit dem Befehl "make" kompilieren können. Genau das sagt die Herausforderung:
Erstellen Sie ein all: ex1-Ziel, das ex1 nur mit dem Befehl make erstellt.
Durch hier und eine Reihe anderer Orte, dies ist der Code, den ich für richtig halte:
%Vor%Wenn ich jedoch versuche, das auszuführen, erhalte ich die kompilierte Datei und bekomme immer einen Fehler:
%Vor%Was passiert hier? Was ist der Grund für die Fehlermeldung? Wie kann ich das beheben?
Danke Leute.
Wenn all
das erste Ziel in Ihrem Makefile ist (ich mache hier eine wilde Vermutung, da Sie nicht das gesamte Makefile gezeigt haben), würde make das als erstes Ziel auswählen, wenn Sie Übergeben Sie kein explizites Ziel von der Befehlszeile (dh nur make
)
ex1
ist eine Voraussetzung für all
, also baut es zuerst und Sie sehen daher die folgende Zeile:
Nachdem ex1
erstellt wurde, versucht make, das Rezept für alle auszuführen, wobei der folgende Befehl ausgeführt wird:
Da -g
für sich kein gültiger Befehl oder eine gültige Anwendung ist, die in der Shell ausgeführt werden kann, erhalten Sie diesen Fehler:
Lösung:
Sie haben CFLAGS
bereits am Anfang des Makefiles definiert, also müssen Sie es nicht noch einmal im Rezept definieren. Selbst wenn Sie die Variable CFLAGS
überschreiben möchten, sollten Sie sie nicht direkt als Teil des Rezepts verwenden.
Definieren Sie all
und clean
als PHONY
Ziele, falls dies noch nicht geschehen ist. Das Ziel all
und clean
erstellen nach der Ausführung des Rezepts keine Datei mit dem Namen all
oder clean
. Daher ist es empfehlenswert, diese Ziele als PHONY
zu klassifizieren.
Sie brauchen keine doppelten Anführungszeichen um -Wall
Das folgende Makefile hat all diese Korrekturen:
%Vor%Sollte alles sein, was Sie benötigen, da make über eine integrierte Standardregel verfügt, um eine .c-Datei in eine ausführbare Datei zu kompilieren.
Ihr Fehler besteht darin, eine Variablenzuweisung als Befehl zu verwenden. Der Teil mit
%Vor% versucht, den Befehl -g
mit einer einmaligen Variablenzuweisung CFLAGS="-Wall"
auszuführen.
Ich möchte eine Anpassung vorschlagen, so dass Sie ex1
nur durch Eingabe von make
erstellen können, unabhängig davon, ob dies die erste Kompilierung oder eine Neukompilierung des Quellcodes ist.
Quelle: ex1.c
Makefile:
%Vor% Durch Hinzufügen des clean
Phony-Ziels als erste Voraussetzung für all
wird der Befehl rm -rf ex1 ex1.dSYM
ausgeführt, bevor der implizierte Befehl cc
mit der Voraussetzung ex1
ausgeführt wird .
Auch unter Mac OS-X ist die Verwendung von .PHONY all clean
nicht notwendig, damit make
die Befehle in Makefile
ausführen kann. Es ist jedoch wahrscheinlich ein guter Vorgänger, dass jeder, der den Code später liest, dies erkennt all und clean sind keine eigentlichen Zieldateien.
Oh, und ein großes Dankeschön an Zed A. Shaw dafür, dass du "Learn the Hard Way" auf seiner Seite lesen darfst Lerne C den harten Weg .
Tags und Links compilation gnu compiler-warnings makefile