create compiler gcc makefile

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 problemas

  • Puede 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