make: Nichts zu tun für `alle’

Lesezeit: 5 Minuten

Benutzeravatar von Angus
Angus

Ich gehe durch ein zB pgm, 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, dieses Programm zu kompilieren.

  • Versuchen Sie, ein „Make Clean“ gefolgt von einem „Make All“ durchzuführen.

    – PaulR

    19. Dezember 2011 um 12:56 Uhr

  • Das ist kein Fehler, es bedeutet nur hello ist aktuell. Veränderung clean zu rm -f *.o hello bevor es etwas Unerwartetes tut, dann laufen make clean all und schau ob das geht.

    – Matte

    19. Dezember 2011 um 12:57 Uhr

  • Sie sollten auch hinzufügen .phony: all cleanseit all und clean sind keine Dateinamen.

    – Kerrek SB

    19. Dezember 2011 um 12:58 Uhr

  • Fügen Sie das -c nicht in Ihre CFLAGS ein.

    – Wildpässer

    19. Dezember 2011 um 12:59 Uhr

Benutzeravatar von VirtualVDX
VirtualVDX

Manchmal kann der Fehler „Für alle nichts zu tun“ durch Leerzeichen vor dem Befehl in der Makefile-Regel anstelle von Tabulatoren verursacht werden. Bitte stellen Sie sicher, dass Sie innerhalb Ihrer Regeln Tabulatoren anstelle von Leerzeichen verwenden.

all:
<\t>$(CC) $(CFLAGS) ...

Anstatt von

all:
    $(CC) $(CFLAGS) ...

Bitte lesen Sie das GNU make Handbuch für die Beschreibung der Regelsyntax: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

  • obj-m += hello.o alle: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) Module bereinigen: make -C /lib/modules/$( Shell uname -r)/build M=$(PWD) clean

    – Narendra Jaggi

    21. Juni 2015 um 8:14 Uhr

  • ist die obige Datei eine gültige Datei??

    – Narendra Jaggi

    21. Juni 2015 um 8:15 Uhr

  • Im Kontext von Eltern-Kind-Makefiles kann manchmal der Fehler „Für alle ist nichts zu tun“ dadurch verursacht werden, dass untergeordnete Ziele im Eltern-Makefile fälschlicherweise als .PHONY gekennzeichnet sind.

    – Donhektor

    27. April 2018 um 23:57 Uhr

  • ich hatte all : src/server/mod_wsgi.lazu dem ich gewechselt habe all : </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 nach sudo make. Irgendeine Hilfe?

    – Mondkrater

    13. Januar 2019 um 17:32 Uhr


  • @cryanbhu bitte stellen Sie sicher, dass Ihre Regeln der Regelsyntax folgen: gnu.org/software/make/manual/make.html#Rule-Syntax.

    – VirtualVDX

    24. April um 13:21 Uhr

Benutzer-Avatar von weeks
Wochenenden

Entferne das hello Datei aus Ihrem Ordner und versuchen Sie es erneut.

Das all Ziel hängt von der ab hello Ziel. Das hello target 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.

  • obj-m += hello.o alle: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) Module bereinigen: make -C /lib/modules/$( Shell uname -r)/build M=$(PWD) clean

    – Narendra Jaggi

    21. Juni 2015 um 8:15 Uhr

  • Ist das obige eine gültige Make-Datei?

    – Narendra Jaggi

    21. Juni 2015 um 8:16 Uhr

Wenn Sie einfach make angeben, wird die erste Regel in Ihrem Makefile erstellt, dh “all”. Sie haben angegeben, dass “all” von “hello” abhängt, das wiederum von main.o, factorial.o und hello.o abhängt. Also versucht ‘make’ zu sehen, ob diese Dateien vorhanden sind.

Wenn sie vorhanden sind, sieht ‘make’ nach, ob sich ihre Abhängigkeiten, zB main.o hat eine Abhängigkeit main.c, geändert haben. Wenn sie sich geändert haben, erstellt make sie neu, andernfalls überspringt sie die Regel. In ähnlicher Weise fährt es rekursiv mit dem Erstellen der geänderten Dateien fort und führt schließlich den obersten Befehl aus, in Ihrem Fall “all”, um Ihnen eine ausführbare Datei zu geben, in Ihrem Fall “hello”.

Wenn sie nicht vorhanden sind, baut make blind alles unter der Regel.

Um zu Ihrem Problem zu kommen, es ist kein Fehler, aber ‘make’ sagt, dass jede Abhängigkeit in Ihrem Makefile auf dem neuesten Stand ist und nichts gemacht werden muss!

Make verhält sich korrekt. hello existiert bereits und ist nicht älter als die .c Dateien, und daher ist keine Arbeit mehr zu erledigen. Es gibt vier Szenarien, in denen make (neu) bauen muss:

  • Wenn Sie eine Ihrer ändern .c Dateien, dann wird es neuer sein als hellound dann muss es neu erstellt werden, wenn Sie make ausführen.
  • Wenn Sie löschen hellodann muss es natürlich wieder aufgebaut werden
  • Sie können make dazu zwingen, alles mit dem neu zu erstellen -B Möglichkeit. make -B all
  • make clean all wird löschen hello und einen Umbau erfordern. (Ich schlage vor, Sie sehen sich den Kommentar von @Mat an rm -f *.o hello

Ich glaube, Sie haben in der 9. Zeile einen Tabulator übersehen. Die folgende Zeile alle: hallo muss eine leere Registerkarte sein. Stellen Sie sicher, dass in der 9. Zeile ein leerer Tabulator vorhanden ist. Dadurch versteht der Interpreter, dass Sie das Standardrezept für das Makefile verwenden möchten.

Benutzeravatar von tripleee
dreifach

Das ist kein Fehler; Der make-Befehl in Unix funktioniert basierend auf den Zeitstempeln. Dh sagen wir, wenn Sie bestimmte Änderungen an vorgenommen haben factorial.cpp und kompilieren mit make dann make zeigt die Information, dass nur die cc -o factorial.cpp Befehl ausgeführt wird. Wenn Sie das nächste Mal denselben Befehl ausführen, dh make ohne Änderungen an einer Datei mit vorzunehmen .cpp Erweiterung sagt der Compiler, dass die Ausgabedatei aktuell ist. Der Compiler gibt diese Informationen aus, bis wir bestimmte Änderungen daran vornehmen file.cpp.

Der Vorteil der makefile besteht darin, dass es die Neukompilierungszeit reduziert, indem nur die Dateien kompiliert werden, die geändert wurden, und indem das Objekt (.o) Dateien der unveränderten Dateien direkt.

Benutzeravatar von Snympi
Snympi

Mit dem Kommentar von Paul R habe ich das gefunden

make clean

gefolgt von

make

oder

make all

mein Problem behoben.

1423580cookie-checkmake: Nichts zu tun für `alle’

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy