Estoy pasando por un pgm por ejemplo para crear un archivo make.
http://mrbook.org/tutorials/make/
Mi carpeta eg_make_creation contiene los siguientes archivos,
desktop:~/eg_make_creation$ ls
factorial.c functions.h hello hello.c main.c Makefile
Makefile
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall
all:hello
hello:main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o:main.c
$(CC) $(CFLAGS) main.c
factorial.o:factorial.c
$(CC) $(CFLAGS) factorial.c
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *o hello
error:
desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Ayúdame a comprender cómo compilar este programa.
hello
está actualizado. Cambieclean
arm -f *.o hello
antes de que haga algo inesperado, luego ejecutemake clean all
y vea si funciona..phony: all clean
, ya queall
yclean
no son nombres de archivo.Respuestas:
A veces, el error "No hay nada que hacer para todos" puede ser causado por espacios antes del comando en la regla del archivo Make en lugar de la pestaña. Asegúrese de utilizar tabulaciones en lugar de espacios dentro de sus reglas.
en vez de
Consulte el manual de GNU make para ver la descripción de la sintaxis de la regla: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
fuente
all : src/server/mod_wsgi.la
, a lo que me cambiéall : </t> src/server/mod_wsgi.la
. Ahora aparece el error:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
aftersudo make
. ¿Alguna ayuda?Eliminar el
hello
archivo de tu carpeta y vuelve a intentarlo.El
all
objetivo depende delhello
objetivo. Elhello
objetivo primero intenta encontrar el archivo correspondiente en el sistema de archivos. Si lo encuentra y está actualizado con los archivos dependientes, no hay nada que hacer.fuente
Cuando simplemente da make, hace la primera regla en su archivo make, es decir, "todos". Ha especificado que "todos" depende de "hola", que depende de main.o, factorial.o y hola.o. Entonces 'make' intenta ver si esos archivos están presentes.
Si están presentes, 'make' ve si sus dependencias, por ejemplo, main.o tiene una dependencia main.c, han cambiado. Si han cambiado, haga las reconstrucciones; de lo contrario, se salta la regla. De manera similar, continúa construyendo de manera recursiva los archivos que han cambiado y finalmente ejecuta el comando más alto, "todos" en su caso para darle un ejecutable, 'hola' en su caso.
Si no están presentes, construye a ciegas todo según la regla.
Llegando a su problema, no es un error, pero 'make' dice que cada dependencia en su archivo MAKE está actualizada y no necesita hacer nada.
fuente
Make se está comportando correctamente.
hello
ya existe y no es más antiguo que los.c
archivos, por lo que no hay más trabajo por hacer. Hay cuatro escenarios en los que make deberá (re) construirse:.c
archivos, será más reciente quehello
, y luego tendrá que reconstruirse cuando ejecute make.hello
, obviamente tendrá que reconstruirlo-B
opción.make -B all
make clean all
eliminaráhello
y requerirá una reconstrucción. (Te sugiero que veas el comentario de @ Mat sobrerm -f *.o hello
fuente
Creo que te perdiste una pestaña en la novena línea. La línea que sigue a todos: hola debe ser una pestaña en blanco. Asegúrese de tener una pestaña en blanco en la novena línea. Hará que el intérprete comprenda que desea utilizar la receta predeterminada para el archivo MAKE.
fuente
Eso no es un error; el comando make en Unix funciona según las marcas de tiempo. Es decir, digamos que si ha realizado ciertos cambios
factorial.cpp
y compila utilizandomake
, make muestra la información de que solocc -o factorial.cpp
se ejecuta el comando. La próxima vez, si ejecuta el mismo comando, es decir,make
sin realizar ningún cambio en ningún archivo con.cpp
extensión, el compilador dice que el archivo de salida está actualizado. El compilador proporciona esta información hasta que realizamos ciertos cambios en algunofile.cpp
.La ventaja de
makefile
es que reduce el tiempo de recompilación compilando los únicos archivos que se modifican y utilizando los.o
archivos object ( ) de los archivos no modificados directamente.fuente
Llegué a este error peculiar y difícil de depurar a través de una ruta diferente. Mi problema terminó siendo que estaba usando una regla de patrón en un paso de compilación cuando el objetivo y la dependencia estaban ubicados en directorios distintos. Algo como esto:
Tenía varias dependencias configuradas de esta manera y estaba tratando de usar una receta de patrón para todas. Claramente, una sola sustitución de "%" no va a funcionar aquí. Hice reglas explícitas para cada dependencia, ¡y me encontré de nuevo entre los cachorros y los unicornios!
¡Espero que esto ayude a alguien!
fuente