Error de makefile de gcc: "No hay regla para hacer objetivo ..."

356

Estoy tratando de usar GCC (Linux) con un archivo MAKE para compilar mi proyecto.

Me sale el siguiente error que parece no poder descifrar en este contexto:

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

Este es el archivo MAKE:

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
Meir
fuente
2
Un ejemplo típico de "hacer" que el archivo fuente "no exista" es restablecer la variable VPATH o SRC por error cuando tiene que agregarla. Me refiero a usnig en VPATH=lugar de VPATH+=. Esto hace que el archivo Makefile no pueda ver los archivos cuando el archivo realmente está allí.
Chan Kim

Respuestas:

425

Eso es generalmente porque no tiene un archivo llamado vertex.cppdisponible para hacer. Mira esto:

  • ese archivo existe.
  • estás en el directorio correcto cuando haces.

Aparte de eso, no tengo mucho más que sugerir. Quizás podría darnos una lista de directorio de ese directorio.

paxdiablo
fuente
2
Sí, algunas de mis clases no tienen archivos .cpp, por lo que no estaban allí, lo que provocó el error. Gracias.
Meir
44
también puede obtener dicho error si hay algunos archivos de encabezado que eliminó pero todavía están en su Makefile
ady
@par, eso me parece una pregunta diferente. Probablemente obtendrá más exposición si se pide como una pregunta.
paxdiablo
Además, asegúrese de guardar su Makefile después de editarlo ... Eso es lo que me atrapó. Hice todas mis ediciones y luego olvidé presionar CTRL + S
Tim
80

En mi experiencia, este error es causado frecuentemente por un error ortográfico .

Recibí este error hoy.

make [1]: *** No hay regla para hacer maintenaceDialog.cpp', needed bymaintenaceDialog.o ' objetivo . Detener.

En mi caso, el error fue simplemente un error de ortografía. La palabra MANTENIMIENTO faltaba es su tercer N.

También revise la ortografía de sus nombres de archivo.

Wes
fuente
2
El meta por qué , en este caso, se debe a la lista explícita de las relaciones objeto / fuente / encabezado. Si las nuevas herramientas como SubCons o CMake no son del gusto, gcc -MT y gnu make patterns puede resolver esto. Ver también .
Nathan Kidd
¡Salvaste mi día! ¡Gracias! :)
Sunit Gautam
En mi caso, el camino estaba mal, ../../src/file.cpero en realidad lo estaba../../src/folder/file.c
Rasmi Ranjan Nayak
31

La razón más común para que se imprima este mensaje es porque olvidó incluir el directorio en el que reside el archivo fuente. Como resultado, gcc "piensa" que este archivo no existe.

Puede agregar el directorio usando el argumento -I a gcc.


fuente
14

En mi caso, había usado comas descabelladas como separadores. Para usar su ejemplo, hice esto:

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

Cambiándolo al equivalente de

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

arreglado.

Nick Knowlson
fuente
11

¿Es eso exactamente? Recuerde que la sintaxis de Makefile es consciente de los espacios en blanco y requiere pestañas para sangrar comandos bajo acciones.

workmad3
fuente
7

El problema que encontré fue aún más tonto que lo que otras personas han mencionado.

Nuestros makefiles obtienen listas de cosas para construir. Alguien agregó TheOtherLibrarya una de las listas, como se muestra a continuación.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Deberían haber hecho esto:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Si lo hubieran hecho de la segunda manera, no habrían eliminado la Libraryconstrucción. La ventaja en +=es muy importante.

kmort
fuente
6

En mi caso, se debió a un error de regla de varias líneas en el Makefile. Tenía algo como:

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

La barra invertida al final de la lista de archivos en CONFIG_OBJ1la regla de 'causó este error. Debería ser como:

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

Uno de los errores frecuentes puede ser un error tipográfico en otro nombre de archivo .

Su ejemplo es bastante sencillo, pero lo que a veces puede confundir son mensajes en makesí mismos. Consideremos un ejemplo.

El contenido de mi carpeta es:

$ ls -1
another_file
index.md
makefile

Mientras que mi makefileparece

all: index.html

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

Aunque tengo index.mddónde debería estar y no hay ningún error en el nombre, el mensaje de makeserá

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

Para ser sincero, el mensaje es confuso . Simplemente dice que no hay una regla. De hecho, significa que la regla es incorrecta, pero debido a las reglas comodín (patrón) makeno se puede determinar qué causó exactamente el problema.

Vamos a alterar makefileun poco, es decir, reemplazar patrones con reglas explícitas:

index.html: index.md wrong_path_to_another_file

Y ahora el mensaje que recibiremos será:

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

¡Milagro! Se podría concluir lo siguiente:

  • Los mensajes de makedependen de reglas y no siempre apuntan a la raíz de los problemas.

  • Puede haber otros problemas makefilediferentes a los especificados por este mensaje

Ahora se nos ocurre la idea de verificar otras dependencias en una regla también:

all: index.html

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

Solo esto nos proporcionará el resultado deseado:

$ make
index.html index.md
Nick Roz
fuente
3

En mi caso, el mensaje de error hacía referencia a un nombre de archivo antiguo, que ya no existía porque se le cambió el nombre. Resultó que la información desactualizada no provenía del Makefile, sino de archivos en .depsdirectorios.

Me encontré con este error después de copiar archivos de una máquina a otra. En ese proceso, supongo que las marcas de tiempo se pusieron en un estado inconsistente, lo que confundió "hacer" al ejecutar varios trabajos en paralelo (similar a este informe de error ).

Las construcciones secuenciales make -j 1no se vieron afectadas, pero me llevó un tiempo darme cuenta porque estaba usando un alias ( make -j 8).

Para limpiar el estado, eliminé todos los .depsarchivos y volví a generar el Makefile. Estos son los comandos que utilicé:

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

Después de eso, el edificio funcionó nuevamente.

Philipp Claßen
fuente
2

Si está tratando de construir John the Ripper "sangrado-jumbo" y obtiene un error como "make: *** No hay regla para hacer objetivo 'linux-x86-64'". Intente ejecutar este comando en su lugar:./configure && make

Ogglas
fuente
0

En mi caso, la fuente y / o los archivos de objetos antiguos fueron bloqueados (solo lectura) por un IDE semi-bloqueado o por un servicio en la nube de respaldo que dejó de funcionar correctamente. Reiniciar todos los programas y servicios que estaban asociados con la estructura de carpetas resolvió el problema.

sskoog
fuente
0

Otro ejemplo de un problema extraño y su solución:

Esta:

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

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

Pero si elimino Poco_LIBRARIESfunciona:

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

Estoy usando clang8 en Mac y clang 3.9 en Linux ¡El problema solo ocurre en Linux pero funciona en Mac!

Olvidé mencionar: Poco_LIBRARIESestaba mal, ¡no fue establecido por cmake / find_package!

Mike Mitterer
fuente
0

En mi caso, la ruta no está establecida en VPATH, después de agregar el error desapareció.

tzuhsun
fuente
0

Hay varias razones para este error.

Una de las razones por las que encontré este error es al compilar para Linux y Windows.

Tengo un nombre de archivo con mayúsculas BaseClass.h SubClass.h Unix mantiene que tiene una convención de archivado que distingue mayúsculas de minúsculas y Windows no distingue entre mayúsculas y minúsculas.

C ++ ¿por qué las personas no usan mayúsculas en nombre de los archivos de encabezado?

Intente compilar una compilación limpia usando gmake clean si está usando gmake

Algunos editores de texto tienen configuraciones predeterminadas para ignorar los nombres de archivo que distinguen entre mayúsculas y minúsculas. Esto también podría conducir al mismo error.

¿Cómo agregar un archivo c ++ en Qt Creator cuyo nombre comienza con mayúsculas? Automáticamente lo hace minúscula

Corning
fuente
0

Este error ocurrió en Travis cuando olvidé agregar nuevos archivos a mi repositorio git. Error tonto, pero puedo ver que es bastante común.

Ryan Deschamps
fuente
-1

En mi caso, fue debido a que llamé al Makefile: MAKEFILE (todo en mayúsculas)

ninjaPixel
fuente