it-swarm.dev

gcc-Makefile-Fehler: "Keine Regel zum Ziel ..."

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

Ich erhalte die folgende Fehlermeldung, die in diesem Zusammenhang nicht zu entschlüsseln 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
304
Meir

Das liegt normalerweise daran, dass Sie keine Datei mit dem Namen vertex.cpp zur Verfügung haben. Prüfe das:

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

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

364
paxdiablo

Meiner Erfahrung nach wird dieser Fehler häufig durch einen SchreibFehler verursacht.

Ich habe diesen Fehler heute bekommen.

make [1]: *** Keine Regel zum Ziel maintenaceDialog.cpp', needed bymaintenaceDialog.o '. Halt.

In meinem Fall war der Fehler einfach ein Schreibfehler. Dem Wort WARTUNG fehlte es das dritte N. 

Überprüfen Sie auch die Schreibweise Ihrer Dateinamen.

64
Wes

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

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

24

In meinem Fall hatte ich knöcherne Kommata als Trennzeichen. Um Ihr Beispiel zu verwenden, habe ich folgendes gemacht:

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

behoben.

12
Nick Knowlson

Ist das genau so? Beachten Sie, dass die Makefile-Syntax Whitespace-fähig ist und Registerkarten zum Einrücken von Befehlen unter Aktionen benötigt.

9
workmad3

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

Unsere Makefiles erhalten eine Liste von zu erstellenden Dingen. Jemand hat TheOtherLibrary zu einer der Listen hinzugefügt (siehe unten).

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Sie hätten das tun sollen:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Wenn sie es auf die zweite Art getan hätten, hätten sie den Build Library nicht gelöscht. Das Plus in += ist sehr wichtig.

7
kmort

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 umgekehrte Schrägstrich am Ende der Dateiliste in der Regel von CONFIG_OBJ1 hat diesen Fehler verursacht. Es sollte so aussehen:

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

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 stammen, sondern aus Dateien in .deps-Verzeichnissen.

Ich bin auf diesen Fehler gestoßen, nachdem ich Dateien von einem Rechner auf einen anderen kopiert habe. In diesem Prozess gehe ich davon aus, dass die Zeitstempel in einen inkonsistenten Zustand geraten sind, was bei der parallelen Ausführung mehrerer Jobs zu Verwirrungen führt (ähnlich wie bei diesem Fehlerbericht ).

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

Um den Status zu bereinigen, habe ich alle .deps-Dateien entfernt und das Makefile neu erstellt. 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 Gebäude wieder.

3
Philipp Claßen

Einer der häufigsten Fehler könnte Tippfehler in einem anderen Dateinamen sein.

Ihr Beispiel ist ziemlich unkompliziert, aber was manchmal verwirrt, sind -Nachrichten von make selbst. Betrachten wir ein Beispiel.

Mein Ordnerinhalt ist:

$ ls -1
another_file
index.md
makefile

Während meine makefile aussieht

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo [email protected] $<

Obwohl ich index.md dort habe, wo es sein sollte und der Name keinen Fehler enthält, wird die Nachricht von make angezeigt

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

Um ehrlich zu sein, die Nachricht ist völlig falsch. Lassen Sie uns makefile etwas ändern, dh Muster durch explizite Regeln ersetzen:

index.html: index.md wrong_path_to_another_file

Und jetzt werden wir folgende Nachricht 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 make hängen von Regeln ab und weisen nicht immer auf die Wurzel von Problemen hin

  • In Ihrer makefile kann es andere Probleme geben als in dieser Nachricht angegeben

Nun haben wir die Idee, dass andere Abhängigkeiten in einer Regel überprüft wird auch:

all: index.html

%.html: %.md another_file
    @echo [email protected] $<

Nur so erhalten wir das gewünschte Ergebnis:

$ make
index.html index.md
2
Nick Roz

Wenn Sie versuchen, John the Ripper "Bleeding-Jumbo" zu bauen, und erhalten Sie die Fehlermeldung "make: *** No rule to make" linux-x86-64 "". Führen Sie stattdessen diesen Befehl aus: ./configure && make

2
Ogglas

Eine andere Lösung, wenn auch nicht wirklich eine Antwort, könnte aber wahrscheinlich jemandem da draußen helfen. Ich weiß nicht, was in meinem Fall falsch war, die Probleme traten eines Tages aus dem Nichts auf, keine Züge, keine Umbenennungen, nichts. Ich habe alle oben genannten Vorschläge und Lösungen ausprobiert, nichts hat geholfen, also habe ich das gesamte Build-Verzeichnis manuell gelöscht und Eclipse dazu gezwungen, Makefile und alle * .mk-Dateien neu zu erstellen.

0
Flot2011

Ein weiteres Beispiel für ein komisches 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 Poco_LIBRARIES entferne, 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 auf Mac!

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

0
Mike Mitterer

In meinem Fall ist der Pfad in VPATH nicht gesetzt, nachdem der Fehler weg ist.

0
tzuhsun

Ich habe dieselbe Fehlermeldung, wenn ich nur das Quellverzeichnis an einen anderen Ort kopiere.

Es wurde behoben, nachdem ich das Build-Verzeichnis verschoben habe.

0
Hareen Laks

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

Einer der Gründe, warum ich auf diesen Fehler gestoßen bin, ist das Erstellen von Linux und Fenstern.

Ich habe einen Dateinamen mit caps BaseClass.h SubClass.h Unix verwaltet die Dateinamenskonvention zwischen Groß- und Kleinschreibung und Windows unterscheidet nicht zwischen Groß- und Kleinschreibung.

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

Versuchen Sie, Clean Build mit gmake clean zu kompilieren, wenn Sie gmake verwenden

Einige Texteditoren haben Standardeinstellungen, um Dateinamen, die die Groß- und Kleinschreibung berücksichtigen, zu ignorieren. Dies kann 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 automatisch Kleinbuchstaben

0
corning

Dieser Fehler trat für mich in Travis auf, als ich vergessen hatte, neue Dateien zu meinem Git-Repository hinzuzufügen. Dummer Fehler, aber ich kann sehen, dass es durchaus üblich ist.

0
Ryan Deschamps

In meinem Fall wurden die Quell- und/oder alte Objektdatei (en) von einem halb abgestürzten IDE oder von einem Cloud-Sicherungsdienst gesperrt (schreibgeschützt), der nicht mehr ordnungsgemäß funktioniert. Durch den Neustart aller Programme und Dienste, die der Ordnerstruktur zugeordnet waren, wurde das Problem behoben.

0
sskoog