Ich gehe ein zB pgm durch, um eine make-Datei zu erstellen.
http://mrbook.org/tutorials/make/
Mein Ordner eg_make_creation enthält die folgenden Dateien:
desktop:~/eg_make_creation$ ls
factorial.c functions.h hello hello.c main.c Makefile
Makefile
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall
all:hello
hello:main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o:main.c
$(CC) $(CFLAGS) main.c
factorial.o:factorial.c
$(CC) $(CFLAGS) factorial.c
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *o hello
Error:
desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Bitte helfen Sie mir zu verstehen, dieses Programm zu kompilieren.
hello
es auf dem neuesten Stand ist. Wechseln Sieclean
zu,rm -f *.o hello
bevor etwas Unerwartetes ausgeführt wird,make clean all
und führen Sie dann aus, ob dies funktioniert..phony: all clean
, daall
undclean
keine Dateinamen.Antworten:
Manchmal kann der Fehler "Nichts für alle tun" durch Leerzeichen vor dem Befehl in der Makefile-Regel anstelle der Registerkarte verursacht werden. Stellen Sie sicher, dass Sie Tabulatoren anstelle von Leerzeichen in Ihren Regeln verwenden.
anstatt
Die Beschreibung der Regelsyntax finden Sie im GNU make-Handbuch: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
quelle
all : src/server/mod_wsgi.la
, zu dem ich gewechselt habeall : </t> src/server/mod_wsgi.la
. Ich bekomme jetzt den Fehler:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
nachsudo make
. Irgendeine Hilfe?Entfernen Sie die
hello
Datei aus Ihrem Ordner und versuchen Sie es erneut.Das
all
Ziel hängt vomhello
Ziel ab. Dashello
Ziel versucht zunächst, die entsprechende Datei im Dateisystem zu finden. Wenn es es findet und mit den abhängigen Dateien auf dem neuesten Stand ist, gibt es nichts zu tun.quelle
Wenn Sie nur make geben, wird die erste Regel in Ihrem Makefile festgelegt, dh "all". Sie haben angegeben, dass "all" von "hello" abhängt, was von main.o, factorial.o und hello.o abhängt. Also versucht 'make' zu sehen, ob diese Dateien vorhanden sind.
Wenn sie vorhanden sind, prüft 'make', ob sich ihre Abhängigkeiten, z. B. main.o hat eine Abhängigkeit main.c, geändert haben. Wenn sie sich geändert haben, erstellen Sie sie neu, andernfalls wird die Regel übersprungen. In ähnlicher Weise werden die geänderten Dateien rekursiv erstellt und schließlich der oberste Befehl "all" in Ihrem Fall ausgeführt, um Ihnen eine ausführbare Datei zu geben, in Ihrem Fall "Hallo".
Wenn sie nicht vorhanden sind, baut blind alles unter der Regel auf.
Wenn Sie zu Ihrem Problem kommen, ist es kein Fehler, aber 'make' bedeutet, dass jede Abhängigkeit in Ihrem Makefile auf dem neuesten Stand ist und nichts gemacht werden muss!
quelle
Make verhält sich richtig.
hello
existiert bereits und ist nicht älter als die.c
Dateien, daher ist keine Arbeit mehr zu erledigen. Es gibt vier Szenarien, in denen make (neu) erstellt werden muss:.c
Dateien ändern , ist sie neuer alshello
und muss neu erstellt werden, wenn Sie make ausführen.hello
, muss es natürlich neu erstellt werden-B
Option können Sie make zwingen, alles neu zu erstellen.make -B all
make clean all
wird gelöschthello
und erfordert eine Neuerstellung. (Ich schlage vor, Sie schauen sich @ Mat's Kommentar über anrm -f *.o hello
quelle
Ich denke, Sie haben einen Tab in der 9. Zeile verpasst. Die folgende Zeile : Hallo, es muss eine leere Registerkarte sein. Stellen Sie sicher, dass Sie in der 9. Zeile eine leere Registerkarte haben. Dadurch wird dem Interpreter klar, dass Sie das Standardrezept für das Makefile verwenden möchten.
quelle
Das ist kein Fehler; Der Befehl make unter Unix funktioniert basierend auf den Zeitstempeln. Das heißt, wenn Sie bestimmte Änderungen vorgenommen
factorial.cpp
und mit kompiliert habenmake
, zeigt make die Information an, dass nur dercc -o factorial.cpp
Befehl ausgeführt wird. Wenn Sie das nächste Mal denselben Befehl ausführen, dhmake
ohne Änderungen an einer Datei mit.cpp
Erweiterung vorzunehmen, gibt der Compiler an, dass die Ausgabedatei auf dem neuesten Stand ist. Der Compiler gibt diese Informationen weiter, bis wir bestimmte Änderungen an irgendwelchen vornehmenfile.cpp
.Der Vorteil von
makefile
ist, dass die Neukompilierungszeit reduziert wird, indem nur die geänderten Dateien kompiliert werden und die object (.o
) - Dateien der nicht geänderten Dateien direkt verwendet werden.quelle
Ich bin auf einem anderen Weg zu diesem eigentümlichen, schwer zu debuggenden Fehler gekommen. Mein Problem bestand darin, dass ich in einem Erstellungsschritt eine Musterregel verwendete, wenn sich das Ziel und die Abhängigkeit in unterschiedlichen Verzeichnissen befanden. Etwas wie das:
Ich hatte mehrere Abhängigkeiten auf diese Weise eingerichtet und versuchte, ein Musterrezept für alle zu verwenden. Natürlich wird eine einzige Ersetzung für "%" hier nicht funktionieren. Ich machte explizite Regeln für jede Abhängigkeit und fand mich wieder unter den Welpen und Einhörnern wieder!
Hoffe das hilft jemandem!
quelle