gcc makefile error: "Keine Regel, um das Ziel zu machen ..."


356

Ich versuche, GCC (Linux) mit einem Makefile zu verwenden, um mein Projekt zu kompilieren.

Ich erhalte den folgenden Fehler, der in diesem Zusammenhang nicht zu entziffern scheint:

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

Dies ist das Makefile:

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

main.o: main.cpp main.h
    g++ -c main.cpp

vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp

edge.o: edge.cpp edge.h
    g++ -c num.cpp

vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp

elist.o: elist.cpp elist.h
    g++ -c elist.cpp

vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp

enode.o: enode.cpp enode.h
    g++ -c node.cpp

2
Ein typisches Beispiel dafür, dass die Quelldatei nicht vorhanden ist, ist das versehentliche Zurücksetzen der VPATH- oder SRC-Variablen, wenn Sie sie hinzufügen müssen. Ich meine usnig VPATH=statt VPATH+=. Dadurch kann die Makefile-Datei die Dateien nicht sehen, wenn die Datei tatsächlich vorhanden ist.
Chan Kim

Antworten:


425

Das liegt normalerweise daran, dass Sie keine Datei namens " vertex.cppverfügbar" haben. Prüfe das:

  • Diese Datei existiert.
  • Sie sind im richtigen Verzeichnis, wenn Sie machen.

Davon abgesehen habe ich nicht viel anderes vorzuschlagen. Vielleicht könnten Sie uns eine Verzeichnisliste dieses Verzeichnisses geben.


2
Ja, einige meiner Klassen haben keine CPP-Dateien, daher waren sie nicht vorhanden und haben den Fehler verursacht. Vielen Dank.
Meir

4
Sie können auch solche Fehlermeldung erhalten , wenn es einige Header - Dateien sind , dass Sie entfernt , ist aber nach wie vor in Ihrem Makefile
Ady

@par, das sieht für mich nach einer anderen Frage aus. Sie werden wahrscheinlich mehr Aufmerksamkeit bekommen , wenn Sie fragen , es als eine Frage.
Paxdiablo

Stellen Sie außerdem sicher, dass Sie Ihr Makefile speichern, nachdem Sie es bearbeitet haben ... Das hat mich dazu gebracht. Ich habe alle meine Änderungen vorgenommen und dann vergessen, STRG + S
Tim

80

Nach meiner Erfahrung wird dieser Fehler häufig durch einen Rechtschreibfehler verursacht.

Ich habe diesen Fehler heute bekommen.

make [1]: *** Keine Regel, um das Ziel maintenaceDialog.cpp', needed bymaintenaceDialog.o 'zu erstellen. Halt.

In meinem Fall war der Fehler einfach ein Rechtschreibfehler. Das Wort WARTUNG fehlte, es ist das dritte N.

Überprüfen Sie auch die Schreibweise Ihrer Dateinamen.


2
Das Meta- Warum liegt in diesem Fall in der expliziten Auflistung der Objekt / Quelle / Header-Beziehungen. Wenn neuere Tools wie SubCons oder CMake nicht schmecken sollen gcc -MT und gnu make pattern dies lösen kann. Siehe auch .
Nathan Kidd

Du hast meinen Tag gerettet! Vielen Dank! :)
Sunit Gautam

In meinem Fall war der Weg falsch, ../../src/file.caber tatsächlich war es../../src/folder/file.c
Rasmi Ranjan Nayak

31

Der häufigste Grund für das Drucken dieser Nachricht ist, dass Sie vergessen haben, das Verzeichnis anzugeben, in dem sich die Quelldatei befindet. Infolgedessen "denkt" gcc, dass diese Datei nicht existiert.

Sie können das Verzeichnis mit dem Argument -I zu gcc hinzufügen.


14

In meinem Fall hatte ich knochenköpfige Kommas als Trennzeichen verwendet. Um Ihr Beispiel zu verwenden, habe ich Folgendes getan:

a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

Ändern Sie es auf das Äquivalent von

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

repariert.


11

Ist das genau das? Denken Sie daran, dass die Makefile-Syntax Whitespace-fähig ist und Tabulatoren zum Einrücken von Befehlen unter Aktionen erforderlich sind.


7

Das Problem, das ich fand, war noch dümmer als das, was andere Leute erwähnt haben.

Unsere Makefiles erhalten Listen mit zu erstellenden Dingen. Jemand hat TheOtherLibraryzu einer der Listen hinzugefügt , wie unten gezeigt.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Sie hätten dies tun sollen:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Hätten sie es auf die zweite Weise gemacht, hätten sie den LibraryBuild nicht ausgelöscht . Das Plus +=ist sehr wichtig.


6

In meinem Fall lag es an einem mehrzeiligen Regelfehler im Makefile. Ich hatte so etwas wie:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...

Der Backslash am Ende der Dateiliste in CONFIG_OBJ1der Regel hat diesen Fehler verursacht. Es sollte so sein:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...

5

Einer der häufigsten Fehler kann ein Tippfehler in einem anderen Dateinamen sein .

Ihr Beispiel ist recht einfach, aber was manchmal verwirren kann, sind Nachrichten von makesich. Betrachten wir ein Beispiel.

Mein Ordnerinhalt ist:

$ ls -1
another_file
index.md
makefile

Während mein makefilesieht aus wie

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

Obwohl ich weiß, index.mdwo es sein sollte und es keinen Fehler im Namen gibt, wird die Nachricht von makesein

make: *** No rule to make target `index.html', needed by `all'.  Stop.

Um ehrlich zu sein, ist die Nachricht verwirrend . Es heißt nur, dass es keine Regel gibt. Tatsächlich bedeutet dies, dass die Regel falsch ist, jedoch aufgrund von Platzhalterregeln (Musterregeln)make nicht bestimmt kann, was genau das Problem verursacht hat.

Lassen Sie uns makefileein wenig ändern , dh Muster durch explizite Regeln ersetzen:

index.html: index.md wrong_path_to_another_file

Und jetzt wird die Nachricht sein, die wir erhalten:

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

Wunder! Folgendes könnte geschlossen werden:

  • Nachrichten von makehängen von Regeln ab und weisen nicht immer auf die Wurzel von Problemen hin

  • Möglicherweise gibt es andere Probleme in Ihrem als in makefiledieser Nachricht angegebenen

Jetzt haben wir die Idee , auch andere Abhängigkeiten in einer Regel zu überprüfen :

all: index.html

%.html: %.md another_file
    @echo $@ $<

Nur so erhalten wir das gewünschte Ergebnis:

$ make
index.html index.md

3

In meinem Fall bezog sich die Fehlermeldung auf einen alten Dateinamen, der nicht mehr vorhanden war, weil er umbenannt wurde. Es stellte sich heraus, dass die veralteten Informationen nicht aus dem Makefile stammten, sondern aus Dateien in .depsVerzeichnissen.

Ich bin auf diesen Fehler gestoßen, nachdem ich Dateien von einem Computer auf einen anderen kopiert habe. In diesem Prozess gehe ich davon aus, dass die Zeitstempel in einem inkonsistenten Zustand sind, was "make" verwirrt, wenn mehrere Jobs gleichzeitig ausgeführt werden (ähnlich wie in diesem Fehlerbericht ).

Sequentielle Builds mit make -j 1waren nicht betroffen, aber es dauerte eine Weile, bis mir klar wurde, dass ich einen Alias ​​verwendete (make -j 8 ) verwendete.

Um den Status zu bereinigen, habe ich alle .depsDateien entfernt und das Makefile neu generiert. Dies sind die Befehle, die ich verwendet habe:

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

Danach funktionierte das Bauen wieder.


2

Wenn Sie versuchen, John the Ripper "blutend-jumbo" zu bauen und eine Fehlermeldung wie "make: *** Keine Regel, um das Ziel 'linux-x86-64' zu machen" erhalten. Versuchen Sie stattdessen, diesen Befehl auszuführen:./configure && make


0

In meinem Fall wurden die Quell- und / oder alte Objektdatei (en) von einer halb abgestürzten IDE oder von einem Backup-Cloud-Dienst, der nicht mehr ordnungsgemäß funktioniert, gesperrt (schreibgeschützt). Das Neustarten aller Programme und Dienste, die der Ordnerstruktur zugeordnet waren, löste das Problem.


0

Ein weiteres Beispiel für ein seltsames Problem und seine Lösung:

Diese:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

gibt: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

Aber wenn ich es entferne Poco_LIBRARIES, funktioniert es:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

Ich verwende clang8 unter Mac und clang 3.9 unter Linux. Das Problem tritt nur unter Linux auf, funktioniert aber unter Mac!

Ich habe vergessen zu erwähnen: Poco_LIBRARIESwar falsch - es wurde nicht von cmake / find_package gesetzt!


0

In meinem Fall ist der Pfad nicht in VPATH festgelegt, nachdem der Fehler hinzugefügt wurde.


0

Es gibt mehrere Gründe für diesen Fehler.

Einer der Gründe, warum ich auf diesen Fehler gestoßen bin, ist beim Erstellen für Linux und Windows.

Ich habe einen Dateinamen mit Großbuchstaben. BaseClass.h SubClass.h Unix verwaltet die Konvention für Dateinamen, bei der zwischen Groß- und Kleinschreibung unterschieden wird, und Windows unterscheidet nicht zwischen Groß- und Kleinschreibung.

C ++ Warum verwenden Benutzer keine Großbuchstaben im Namen von Header-Dateien?

Versuchen Sie, einen sauberen Build mit gmake clean zu kompilieren, wenn Sie gmake verwenden

Einige Texteditoren verfügen über Standardeinstellungen zum Ignorieren von Dateinamen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Dies könnte auch zu demselben Fehler führen.

Wie füge ich eine C ++ - Datei in Qt Creator hinzu, deren Name mit Großbuchstaben beginnt? Es macht es automatisch zu einem kleinen Buchstaben


0

Dieser Fehler trat bei mir in Travis auf, als ich vergaß, meinem Git-Repository neue Dateien hinzuzufügen. Dummer Fehler, aber ich kann sehen, dass er ziemlich häufig ist.


-1

In meinem Fall war es darauf zurückzuführen, dass ich das Makefile aufgerufen habe: MAKEFILE (alle Großbuchstaben)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.