Erro de makefile do gcc: "Nenhuma regra para definir o destino ..."


356

Estou tentando usar o GCC (linux) com um makefile para compilar meu projeto.

Eu recebo o seguinte erro que parece não conseguir decifrar neste contexto:

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

Este é o 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
Um exemplo típico de 'tornar' o arquivo de origem 'inexistente' é redefinir a variável VPATH ou SRC por engano quando você precisar adicioná-lo. Quero dizer, usnig em VPATH=vez de VPATH+=. Isso faz com que o arquivo Makefile não consiga ver os arquivos quando o arquivo realmente está lá.
Chan Kim

Respostas:


425

Isso geralmente ocorre porque você não tem um arquivo chamado vertex.cppdisponível para criação. Verifique se:

  • esse arquivo existe.
  • você está no diretório certo quando cria.

Fora isso, não tenho muito mais o que sugerir. Talvez você possa nos fornecer uma listagem desse diretório.


2
Sim, algumas das minhas aulas não têm arquivos .cpp, portanto não estavam lá, causando o erro. Obrigado.
Meir

4
você também pode obter esse erro se existem alguns arquivos de cabeçalho que foram removidos, mas ainda estão em seu Makefile
Ady

@par, isso parece uma pergunta diferente para mim. Você provavelmente vai ter mais exposição, se você perguntar isso como uma questão.
21416 Paxdiablo

Além disso, certifique-se de salvar seu Makefile após editá-lo ... Foi isso que me pegou. Eu fiz todas as minhas edições e esqueci de pressionar CTRL + S
Tim

80

Na minha experiência, esse erro é freqüentemente causado por um erro de ortografia .

Eu recebi esse erro hoje.

make [1]: *** Nenhuma regra para fazer o destino maintenaceDialog.cpp', needed bymaintenaceDialog.o '. Pare.

No meu caso, o erro foi simplesmente um erro de ortografia. Faltava a palavra MANUTENÇÃO, é o terceiro N.

Verifique também a ortografia nos seus nomes de arquivo.


2
A meta por que , nesse caso, é por causa da lista explícita dos relacionamentos objeto / fonte / cabeçalho. Se ferramentas mais novas, como SubCons ou CMake, não são a gosto, gcc -MT e o gnu make patterns pode resolver isso. Veja também .
Nathan Kidd

Você salvou meu dia! Obrigado! :)
Sunit Gautam 21/03

No meu caso, o caminho estava errado, ../../src/file.cmas na verdade era../../src/folder/file.c
Rasmi Ranjan Nayak 17/04

31

O motivo mais comum para essa mensagem ser impressa é porque você esqueceu de incluir o diretório em que o arquivo de origem reside. Como resultado, o gcc "pensa" que esse arquivo não existe.

Você pode adicionar o diretório usando o argumento -I no gcc.


14

No meu caso, usei vírgulas de cabeça para separar os ossos. Para usar seu exemplo, eu fiz isso:

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

Alterando-o para o equivalente a

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

consertou.


11

É exatamente isso? Lembre-se de que a sintaxe Makefile reconhece espaços em branco e requer guias para recuar comandos sob ações.


7

O problema que encontrei foi ainda mais tolo do que o que outras pessoas mencionaram.

Nossos makefiles recebem listas de coisas a serem construídas. Alguém foi adicionado TheOtherLibrarya uma das listas, como mostrado abaixo.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Eles deveriam ter feito isso:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Se eles tivessem feito isso da segunda maneira, não teriam destruído a Libraryconstrução. A vantagem +=é muito importante.


6

No meu caso, foi devido a um erro de regra de várias linhas no Makefile. Eu tinha algo como:

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

A barra invertida no final da lista de arquivos na CONFIG_OBJ1regra causou esse erro. Deve ser como:

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

5

Um dos erros frequentes pode ser erro de digitação em outro nome de arquivo .

Seu exemplo é bastante direto, mas o que às vezes pode confundir são mensagens de makesi mesmo. Vamos considerar um exemplo.

O conteúdo da minha pasta é:

$ ls -1
another_file
index.md
makefile

Considerando que minha makefileaparência

all: index.html

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

Embora eu tenha index.mdonde deve estar e não haja erro no nome, a mensagem de makeserá

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

Para ser honesto, a mensagem é confusa . Apenas diz que não há regra. De fato, isso significa que a regra está errada, mas devido às regras curinga (padrão) makenão é possível determinar o que exatamente causou o problema.

Vamos alterar makefileum pouco, ou seja, substituir padrões por regras explícitas:

index.html: index.md wrong_path_to_another_file

E agora a mensagem que receberemos será:

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

Milagre! Pode-se concluir o seguinte:

  • As mensagens de makedependem de regras e nem sempre apontam para a raiz dos problemas

  • Pode haver outros problemas makefilediferentes dos especificados por esta mensagem

Agora, também temos a ideia de verificar outras dependências em uma regra :

all: index.html

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

Somente isso nos fornecerá o resultado desejado:

$ make
index.html index.md

3

No meu caso, a mensagem de erro se referia a um nome de arquivo antigo, que não existia mais porque foi renomeado. Aconteceu que as informações desatualizadas não vieram do Makefile, mas dos arquivos nos .depsdiretórios.

Corri para esse erro depois de copiar arquivos de uma máquina para outra. Nesse processo, suponho que os carimbos de data e hora entraram em um estado inconsistente, o que confundiu "make" ao executar vários trabalhos em paralelo (semelhante a este relatório de erro ).

Construções seqüenciais com make -j 1não foram afetadas, mas demorei um pouco para perceber porque estava usando um alias ( make -j 8).

Para limpar o estado, removi todos os .depsarquivos e regenerei o Makefile. Estes são os comandos que eu usei:

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

Depois disso, o prédio funcionou novamente.


2

Se você está tentando criar o John the Ripper "bleeding-jumbo" e receber um erro como "make: *** Nenhuma regra para definir o destino 'linux-x86-64'". Tente executar este comando:./configure && make


0

No meu caso, o (s) arquivo (s) de origem e / ou objeto antigo foram bloqueados (somente leitura) por um IDE semi-travado ou por um serviço de nuvem de backup que parou de funcionar corretamente. A reinicialização de todos os programas e serviços associados à estrutura de pastas resolveu o problema.


0

Outro exemplo de um problema estranho e sua solução:

Este:

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.

Mas se eu removê- Poco_LIBRARIESlo, funciona:

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

Estou usando o clang8 no Mac e o clang 3.9 no Linux O problema ocorre apenas no Linux, mas funciona no Mac!

Esqueci de mencionar: Poco_LIBRARIESestava errado - não foi definido pelo cmake / find_package!


0

No meu caso, o caminho não está definido no VPATH, depois de adicionado o erro.


0

Existem vários motivos para esse erro.

Uma das razões pelas quais encontrei esse erro é ao criar para linux e windows.

Eu tenho um nome de arquivo com caps BaseClass.h SubClass.h O Unix mantém uma convenção de nomes de arquivos com distinção entre maiúsculas e minúsculas e o Windows não diferencia maiúsculas de minúsculas.

C ++ por que as pessoas não usam maiúsculas no nome dos arquivos de cabeçalho?

Tente compilar o build limpo usando o gmake clean se você estiver usando o gmake

Alguns editores de texto têm configurações padrão para ignorar nomes de arquivos que diferenciam maiúsculas de minúsculas. Isso também pode levar ao mesmo erro.

como adicionar um arquivo c ++ no Qt Creator cujo nome começa com letras maiúsculas? Faz automaticamente letras minúsculas


0

Este erro ocorreu dentro do Travis quando esqueci de adicionar novos arquivos ao meu repositório git. Erro bobo, mas posso ver isso sendo bastante comum.


-1

No meu caso, foi devido a mim chamar o Makefile: MAKEFILE (all caps)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.