Errore di makefile gcc: "Nessuna regola per rendere target ..."


356

Sto cercando di usare GCC (linux) con un makefile per compilare il mio progetto.

Ottengo il seguente errore che sembra non riuscire a decifrare in questo contesto:

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

Questo è il 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
Un tipico esempio di "non rendere" il file di origine "non esistente" consiste nel reimpostare per errore la variabile VPATH o SRC quando è necessario aggiungerla. Intendo usnig VPATH=invece di VPATH+=. Questo rende il file Makefile impossibile vedere i file quando il file è effettivamente lì.
Chan Kim,

Risposte:


425

Questo di solito perché non hai un file chiamato vertex.cppdisponibile per la creazione. Controllalo:

  • quel file esiste.
  • sei nella directory giusta quando fai.

A parte questo, non ho molto altro da suggerire. Forse potresti darci un elenco di directory di quella directory.


2
Sì, alcune delle mie lezioni non hanno file .cpp, quindi non c'erano, causando l'errore. Grazie.
Meir,

4
puoi anche ottenere un tale errore se ci sono alcuni file di intestazione che hai rimosso ma sono ancora nel tuo Makefile
ady,

@par, mi sembra una domanda diversa. Probabilmente ottenere più esposizione, se si chiede come una domanda.
paxdiablo,

Inoltre, assicurati di salvare il tuo Makefile dopo averlo modificato ... Questo è quello che mi ha preso. Ho fatto tutte le mie modifiche e poi ho dimenticato di premere CTRL + S
Tim

80

Nella mia esperienza, questo errore è spesso causato da un'ortografia errore di .

Ho ricevuto questo errore oggi.

make [1]: *** Nessuna regola per rendere target maintenaceDialog.cpp', needed bymaintenaceDialog.o '. Fermare.

Nel mio caso l'errore era semplicemente un errore di ortografia. Mancava la parola MANUTENZIONE è il terzo N.

Controlla anche l'ortografia dei nomi dei file.


2
Il meta perché , in questo caso, è dovuto alla lista esplicita delle relazioni oggetto / sorgente / intestazione. Se gli strumenti più recenti come SubCons o CMake non sono da provare , gcc -MT e gnu make pattern può risolverlo. Vedi anche .
Nathan Kidd

Mi hai salvato la giornata! Grazie! :)
Sunit Gautam il

Nel mio caso il percorso era sbagliato ../../src/file.cma in realtà lo era../../src/folder/file.c
Rasmi Ranjan Nayak il

31

Il motivo più comune per la stampa di questo messaggio è perché hai dimenticato di includere la directory in cui risiede il file di origine. Di conseguenza, gcc "pensa" che questo file non esista.

Puoi aggiungere la directory usando l'argomento -I in gcc.


14

Nel mio caso avevo usato virgolette come separatori. Per usare il tuo esempio ho fatto questo:

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

Modificandolo con l'equivalente di

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

aggiustato.


11

È esattamente? Ricorda che la sintassi di Makefile è consapevole degli spazi bianchi e richiede che le schede indentino i comandi sotto le azioni.


7

Il problema che ho riscontrato è stato persino più sciocco di quanto menzionato da altre persone.

I nostri makefile ricevono liste di cose da costruire. Qualcuno ha aggiunto TheOtherLibrarya uno degli elenchi, come mostrato di seguito.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Avrebbero dovuto farlo:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Se lo avessero fatto nel secondo modo, non avrebbero cancellato la Librarybuild. Il vantaggio +=è molto importante.


6

Nel mio caso era dovuto a un errore di regola su più righe nel Makefile. Ho avuto qualcosa di simile:

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

La barra rovesciata alla fine dell'elenco dei file nella CONFIG_OBJ1regola ha causato questo errore. Dovrebbe essere come:

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

5

Uno degli errori frequenti potrebbe essere la battitura in un altro nome di file .

Il tuo esempio è piuttosto semplice ma ciò che a volte può confondere sono i messaggi di makese stesso. Consideriamo un esempio.

Il contenuto della mia cartella è:

$ ls -1
another_file
index.md
makefile

Mentre il mio makefilesembra

all: index.html

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

Anche se ho index.mddove dovrebbe essere e non c'è nessun errore nel nome, il messaggio makesarà

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

Ad essere onesti, il messaggio è confuso . Dice solo che non esiste una regola. In realtà, significa che la regola è sbagliata, ma a causa di regole jolly (modello)make non è possibile determinare cosa abbia causato esattamente il problema.

Consente di modificare makefileun po ', vale a dire sostituire i modelli con regole esplicite:

index.html: index.md wrong_path_to_another_file

E ora il messaggio che riceviamo sarà:

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

Miracolo! Si potrebbe concludere quanto segue:

  • I messaggi di makedipendono dalle regole e non indicano sempre la radice dei problemi

  • Potrebbero esserci altri problemi nel tuo makefilediverso da quello specificato da questo messaggio

Ora abbiamo avuto l'idea di controllare anche altre dipendenze in una regola :

all: index.html

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

Solo questo ci fornirà il risultato desiderato:

$ make
index.html index.md

3

Nel mio caso, il messaggio di errore si riferiva a un vecchio nome file, che non esisteva più perché è stato rinominato. Si è scoperto che le informazioni obsolete non provenivano dal Makefile, ma dai file nelle .depsdirectory.

Ho riscontrato questo errore dopo aver copiato i file da una macchina all'altra. In questo processo, suppongo che i timestamp siano in uno stato incoerente, che ha confuso "make" quando si eseguono più lavori in parallelo (simile a questa segnalazione di bug ).

Le build sequenziali con make -j 1non erano interessate, ma mi ci è voluto un po 'di tempo per capire perché stavo usando un alias ( make -j 8).

Per ripulire lo stato, ho rimosso tutti i .depsfile e rigenerato il Makefile. Questi sono i comandi che ho usato:

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

Successivamente, l'edificio ha funzionato di nuovo.


2

Se stai cercando di creare "bleeding-jumbo" di John the Ripper e ottenere un errore del tipo "make: *** Nessuna regola per creare il target 'linux-x86-64'". Prova invece a eseguire questo comando:./configure && make


0

Nel mio caso, i file di origine e / o dei vecchi oggetti sono stati bloccati (sola lettura) da un IDE semi-bloccato o da un servizio cloud di backup che ha smesso di funzionare correttamente. Il riavvio di tutti i programmi e servizi associati alla struttura delle cartelle ha risolto il problema.


0

Un altro esempio di uno strano problema e la sua soluzione:

Questo:

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

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

Ma se lo rimuovo Poco_LIBRARIESfunziona:

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

Sto usando clang8 su Mac e clang 3.9 su Linux Il problema si verifica solo su Linux ma funziona su Mac!

Ho dimenticato di menzionare: Poco_LIBRARIESera sbagliato - non è stato impostato da cmake / find_package!


0

Nel mio caso il percorso non è impostato in VPATH, dopo aver aggiunto l'errore sparito.


0

Esistono diversi motivi per questo errore.

Uno dei motivi per cui ho riscontrato questo errore è durante la creazione di Linux e Windows.

Ho un nome file con maiuscole BaseClass.h SubClass.h Unix mantiene una convenzione di denominazione dei file con distinzione tra maiuscole e minuscole e Windows non distingue tra maiuscole e minuscole.

C ++ perché le persone non usano maiuscole nel nome dei file di intestazione?

Prova a compilare clean build usando gmake clean se stai usando gmake

Alcuni editor di testo hanno impostazioni predefinite per ignorare i nomi dei file con distinzione tra maiuscole e minuscole. Questo potrebbe anche portare allo stesso errore.

come aggiungere un file c ++ in Qt Creator il cui nome inizia con le maiuscole? Lo rende automaticamente una lettera minuscola


0

Questo errore si è verificato per me all'interno di Travis quando ho dimenticato di aggiungere nuovi file al mio repository git. Errore sciocco, ma vedo che è abbastanza comune.


-1

Nel mio caso, mi è stato dovuto chiamare il Makefile: MAKEFILE (tutto maiuscolo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.