gcc - compiler - makefile structure
gcc makefile error: "No hay regla para hacer objetivo..." (17)
Estoy tratando de usar GCC (linux) con un makefile para compilar mi proyecto.
Recibo 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 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
¿Es eso exactamente? Recuerde que la sintaxis de Makefile es compatible con espacios en blanco y requiere pestañas para sangrar los comandos en las acciones.
El problema que encontré era incluso más tonto que lo que otras personas han mencionado.
Nuestros makefiles pasan listas de cosas para construir. Alguien agregó TheOtherLibrary
a 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 compilación de la Library
. El plus en +=
es muy importante.
En mi caso he utilizado comas con cabeza áspera como separadores. Para usar tu 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.
En mi caso se debió a un error de regla de varias líneas en el Makefile. Tuve 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 la regla de CONFIG_OBJ1
causó este error. Debería ser como
OBJS-$(CONFIG_OBJ1) += file1.o file2.o /
file3.o file4.o
OBJS-$(CONFIG_OBJ2) += file5.o
...
En mi caso, el mensaje de error se refería 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 de Makefile, sino de archivos en directorios .deps
.
Me encontré con este error después de copiar archivos de una máquina a otra. En ese proceso, asumo que las marcas de tiempo se pusieron en un estado incoherente, lo que confundió "make" al ejecutar varios trabajos en paralelo (similar a este informe de error ).
Las compilaciones secuenciales con make -j 1
no se vieron afectadas, pero me tomó un tiempo darme cuenta porque estaba usando un alias ( make -j 8
).
Para limpiar el estado, .deps
todos los archivos .deps
y .deps
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, la construcción funcionó de nuevo.
En mi caso, fue debido a que llamé a Makefile: MAKEFILE (todo mayúsculas)
En mi caso, la fuente y / o el (los) archivo (s) de objeto antiguo (s) fueron bloqueados (solo lectura) por un IDE semi-estrellado o por un servicio de copia de seguridad en la nube que dejó de funcionar correctamente. El reinicio de todos los programas y servicios que estaban asociados con la estructura de carpetas solucionó el problema.
En mi caso, la ruta no se establece en VPATH, después de agregar el error desaparecido.
En mi experiencia, este error es frecuentemente causado por un error de ortografía .
Tengo este error hoy.
make [1]: *** No hay una regla para hacer target
maintenaceDialog.cpp'', needed by
maintenaceDialog.o''. Detener.
En mi caso el error fue simplemente un error de ortografía. La palabra MANTENIMIENTO faltaba en la tercera N.
También revise la ortografía en sus nombres de archivo.
Eso suele ser porque no tienes un archivo llamado vertex.cpp
disponible 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. Tal vez usted podría darnos una lista de directorios de ese directorio.
Este error se me ocurrió dentro de Travis cuando olvidé agregar archivos nuevos a mi repositorio git. Error tonto, pero puedo ver que es bastante común.
Hay múltiples razones para este error.
Una de las razones por las que encontré este error es al compilar Linux y Windows.
Tengo un nombre de archivo con mayúsculas BaseClass.h SubClass.h Unix mantiene una convención de nombres de archivo que distingue entre mayúsculas y minúsculas y Windows no distingue entre mayúsculas y minúsculas.
C ++ ¿Por qué las personas no usan mayúsculas en el nombre de los archivos de encabezado?
Intente compilar compilación limpia utilizando gmake clean si está utilizando gmake
Algunos editores de texto tienen configuraciones predeterminadas para ignorar los nombres de archivos que distinguen entre mayúsculas y minúsculas. Esto también podría llevar al mismo error.
¿Cómo agregar un archivo c ++ en Qt Creator cuyo nombre comience con letras mayúsculas? Se convierte automáticamente en minúscula.
La razón más común por la que se imprime 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.
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.
make[3]: *** No rule to make target ''/usr/lib/libPocoFoundationd.so'', needed by ''../hello_poco/bin/mac/HelloPoco''. Stop.
Pero si quito Poco_LIBRARIES
funciona:
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_LIBRARIES
estaba mal, ¡no fue establecido por cmake / find_package!
Recibí el mismo error cuando solo copio el directorio de origen a una ubicación diferente.
Se resolvió después de mover el directorio de compilación también.
Si está tratando de construir John the Ripper "blood-jumbo" y recibe un error como "make: *** No hay regla para hacer que el objetivo ''linux-x86-64''". Intente ejecutar este comando en su lugar: ./configure && make
Uno de los errores frecuentes puede ser error tipográfico en otro nombre de archivo .
Su ejemplo es bastante sencillo, pero lo que a veces puede confundir son mensajes de sí mismo. Consideremos un ejemplo.
El contenido de mi carpeta es:
$ ls -1
another_file
index.md
makefile
Mientras que mi makefile
parece
all: index.html
%.html: %.md wrong_path_to_another_file
@echo $@ $<
Aunque tengo index.md
donde debería estar y no hay ningún error en su nombre, el mensaje de make
será
make: *** No rule to make target `index.html'', needed by `all''. Stop.
Para ser honesto, el mensaje es totalmente erróneo . Permite modificar un poco el makefile
, 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
make
dependen de las reglas y no siempre apuntan a la raíz de los problemasPuede haber otros problemas en su
makefile
diferentes a los especificados por este mensaje
Ahora se nos ha ocurrido 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