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
VPATH=
stattVPATH+=
. Dadurch kann die Makefile-Datei die Dateien nicht sehen, wenn die Datei tatsächlich vorhanden ist.Antworten:
Das liegt normalerweise daran, dass Sie keine Datei namens "
vertex.cpp
verfügbar" haben. Prüfe das:Davon abgesehen habe ich nicht viel anderes vorzuschlagen. Vielleicht könnten Sie uns eine Verzeichnisliste dieses Verzeichnisses geben.
quelle
Nach meiner Erfahrung wird dieser Fehler häufig durch einen Rechtschreibfehler verursacht.
Ich habe diesen Fehler heute bekommen.
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.
quelle
gcc -MT
und gnu make pattern dies lösen kann. Siehe auch .../../src/file.c
aber tatsächlich war es../../src/folder/file.c
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.
quelle
In meinem Fall hatte ich knochenköpfige Kommas als Trennzeichen verwendet. Um Ihr Beispiel zu verwenden, habe ich Folgendes getan:
Ändern Sie es auf das Äquivalent von
repariert.
quelle
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.
quelle
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
TheOtherLibrary
zu einer der Listen hinzugefügt , wie unten gezeigt.Sie hätten dies tun sollen:
Hätten sie es auf die zweite Weise gemacht, hätten sie den
Library
Build nicht ausgelöscht . Das Plus+=
ist sehr wichtig.quelle
In meinem Fall lag es an einem mehrzeiligen Regelfehler im Makefile. Ich hatte so etwas wie:
Der Backslash am Ende der Dateiliste in
CONFIG_OBJ1
der Regel hat diesen Fehler verursacht. Es sollte so sein:quelle
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
make
sich. Betrachten wir ein Beispiel.Mein Ordnerinhalt ist:
Während mein
makefile
sieht aus wieObwohl ich weiß,
index.md
wo es sein sollte und es keinen Fehler im Namen gibt, wird die Nachricht vonmake
seinUm 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
makefile
ein wenig ändern , dh Muster durch explizite Regeln ersetzen:Und jetzt wird die Nachricht sein, die wir erhalten:
Wunder! Folgendes könnte geschlossen werden:
Nachrichten von
make
hängen von Regeln ab und weisen nicht immer auf die Wurzel von Problemen hinMöglicherweise gibt es andere Probleme in Ihrem als in
makefile
dieser Nachricht angegebenenJetzt haben wir die Idee , auch andere Abhängigkeiten in einer Regel zu überprüfen :
Nur so erhalten wir das gewünschte Ergebnis:
quelle
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
.deps
Verzeichnissen.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 1
waren 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
.deps
Dateien entfernt und das Makefile neu generiert. Dies sind die Befehle, die ich verwendet habe:Danach funktionierte das Bauen wieder.
quelle
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
quelle
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.
quelle
Ein weiteres Beispiel für ein seltsames Problem und seine Lösung:
Diese:
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: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_LIBRARIES
war falsch - es wurde nicht von cmake / find_package gesetzt!quelle
In meinem Fall ist der Pfad nicht in VPATH festgelegt, nachdem der Fehler hinzugefügt wurde.
quelle
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
quelle
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.
quelle
In meinem Fall war es darauf zurückzuführen, dass ich das Makefile aufgerufen habe: MAKEFILE (alle Großbuchstaben)
quelle