gcc makefile-fout: Geen regel om doel te maken

Ik probeer GCC (linux) te gebruiken met een makefile om mijn project te compileren.

Ik krijg de volgende foutmelding die in deze context niet kan worden ontcijferd:

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

Dit is de 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

Antwoord 1, autoriteit 100%

Dat komt meestal omdat je geen bestand met de naam vertex.cppbeschikbaar hebt om te maken. Controleer dat:

  • dat bestand bestaat.
  • je bent in de juiste map wanneer je maakt.

Anders dan dat heb ik niet veel anders te suggereren. Misschien kunt u ons een directory-lijst van die directory geven.


Antwoord 2, autoriteit 18%

Naar mijn ervaring wordt deze fout vaak veroorzaakt door een spellingfout.

Ik kreeg deze fout vandaag.

make[1]: *** Geen regel om doel maintenaceDialog.cpp', needed bymaintenaceDialog.o’. Stop.

In mijn geval was de fout gewoon een spelfout. Het woord ONDERHOUD ontbrak de derde N.

Controleer ook de spelling van uw bestandsnamen.


Antwoord 3, autoriteit 7%

De meest voorkomende reden voor het afdrukken van dit bericht is dat u bent vergeten de map op te nemen waarin het bronbestand zich bevindt. Als gevolg hiervan “denkt” gcc dat dit bestand niet bestaat.

Je kunt de map toevoegen met het argument -I aan gcc.


Antwoord 4, autoriteit 3%

In mijn geval had ik komma’s met botte kop als scheidingstekens. Om jouw voorbeeld te gebruiken heb ik dit gedaan:

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

Het wijzigen in het equivalent van

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

het is opgelost.


Antwoord 5, autoriteit 2%

Is dat het precies? Onthoud dat de Makefile-syntaxis witruimte-bewust is en tabs vereist om opdrachten onder acties te laten inspringen.


Antwoord 6, autoriteit 2%

Het probleem dat ik vond was nog dwazer dan wat andere mensen hebben genoemd.

Onze makefiles krijgen lijsten met dingen die gebouwd moeten worden. Iemand heeft TheOtherLibrarytoegevoegd aan een van de lijsten, zoals hieronder weergegeven.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Ze hadden dit moeten doen:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Als ze het op de tweede manier hadden gedaan, hadden ze de build van Libraryniet weggevaagd. De plus in +=is erg belangrijk.


Antwoord 7

In mijn geval was het te wijten aan een regelfout met meerdere regels in de Makefile. Ik had zoiets als:

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

De backslash aan het einde van de bestandslijst in de regel van CONFIG_OBJ1heeft deze fout veroorzaakt. Het zou moeten zijn als:

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

Antwoord 8

Een van de veel voorkomende fouten kan een typfout zijn in een andere bestandsnaam.

Uw voorbeeld is vrij eenvoudig, maar wat soms verwarrend kan zijn, is:
berichten van makezelf. Laten we een voorbeeld bekijken.

De inhoud van mijn map is:

$ ls -1
another_file
index.md
makefile

Terwijl mijn Makefileeruitziet als

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

Hoewel ik index.mdheb waar het zou moeten zijn en er geen fout in de naam ervan staat, zal het bericht van makezijn

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

Om eerlijk te zijn het bericht is verwarrend. Er staat alleen dat er geen regel is. In feite betekent dit dat de regel verkeerd is, maar vanwege wildcard (patroon) regels kan makeniet bepalen wat het probleem precies heeft veroorzaakt.

Laten we Makefileeen beetje aanpassen, dat wil zeggen patronen vervangen door expliciete regels:

index.html: index.md wrong_path_to_another_file

En nu is het bericht dat we krijgen:

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

Wonder! Het volgende kan worden geconcludeerd:

  • Berichten van makezijn afhankelijk van regels en wijzen niet altijd op de oorzaak van problemen

  • Er kunnen andere problemen zijn in uw Makefiledie verschillen van de specificaties in dit bericht

Nu zijn we op het idee gekomen om ook andere afhankelijkheden in een regel te controleren:

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

Alleen dit zal ons het gewenste resultaat opleveren:

$ make
index.html index.md

Antwoord 9

In mijn geval verwees de foutmelding naar een oude bestandsnaam, die niet meer bestond omdat deze hernoemd was. Het bleek dat de verouderde informatie niet uit de Makefile kwam, maar uit bestanden in .deps-directories.

Ik kwam deze fout tegen na het kopiëren van bestanden van de ene machine naar de andere. In dat proces neem ik aan dat de tijdstempels in een inconsistente staat kwamen, wat “make” verwarde bij het parallel uitvoeren van meerdere taken (vergelijkbaar met dit bugrapport).

Sequentiële builds met make -j 1werden niet beïnvloed, maar het duurde even voordat ik het doorhad omdat ik een alias gebruikte (make -j 8).

Om de status op te schonen, heb ik alle .deps-bestanden verwijderd en de Makefile opnieuw gegenereerd. Dit zijn de commando’s die ik heb gebruikt:

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

Daarna werkte het bouwen weer.


Antwoord 10

Als je John the Ripper “bleeding-jumbo” probeert te bouwen en een foutmelding krijgt zoals “make: *** No rule to make target ‘linux-x86-64′”. Probeer in plaats daarvan dit commando uit te voeren: ./configure && make


Antwoord 11

In mijn geval waren de bron- en/of oude objectbestanden vergrendeld (alleen-lezen) door een semi-gecrashte IDE of door een back-up-cloudservice die niet meer goed werkte. Het herstarten van alle programma’s en services die aan de mappenstructuur waren gekoppeld, loste het probleem op.


Antwoord 12

Nog een voorbeeld van een raar probleem en de oplossing:

Dit:

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

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

Maar als ik Poco_LIBRARIESverwijder, werkt het:

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

Ik gebruik clang8 op Mac en clang 3.9 op Linux
Het probleem doet zich alleen voor op Linux, maar werkt op Mac!

Ik ben vergeten te vermelden: Poco_LIBRARIESwas fout – het is niet ingesteld door cmake/find_package!


Antwoord 13

In mijn geval is het pad niet ingesteld in VPATH, nadat de fout is toegevoegd, is het verdwenen.


Antwoord 14

Er zijn meerdere redenen voor deze fout.

Een van de redenen waarom ik deze fout tegenkwam, was tijdens het bouwen voor Linux en Windows.

Ik heb een bestandsnaam met hoofdletters BaseClass.h SubClass.h
Unix handhaaft hoofdlettergevoelige bestandsnaamconventies en windows is niet hoofdlettergevoelig.

C++ waarom mensen niet gebruiken hoofdletters in naam van header-bestanden?

Probeer clean build te compileren met gmake clean als je gmake gebruikt

Sommige teksteditors hebben standaardinstellingen om hoofdlettergevoelige bestandsnamen te negeren. Dit kan ook tot dezelfde fout leiden.

hoe voeg je een c++-bestand toe in Qt Creator waarvan de naam met hoofdletters begint? Het maakt het automatisch een kleine letter


Antwoord 15

Deze fout deed zich voor in Travis toen ik vergat nieuwe bestanden toe te voegen aan mijn git-repository. Domme fout, maar ik zie dat het heel gewoon is.


Antwoord 16

Dit bericht kan veel dingen duidelijk betekenen.

In mijn geval was het compileren met meerdere threads. Eén thread had een afhankelijkheid nodig die een andere thread nog niet had gemaakt, wat een fout veroorzaakte.

Niet alle builds zijn threadsafe, dus overweeg een langzame build met één thread als uw build andere tests doorstaat, zoals de hierboven genoemde.


Antwoord 17

In mijn geval was het te wijten aan het feit dat ik een bestand als Makefilein een krat had gezet, in plaats daarvan zou het Makefilemoeten zijn.


Antwoord 18

In mijn geval was het te wijten aan het feit dat ik de Makefile noemde: MAKEFILE (allemaal in hoofdletters)

Other episodes