1) El programa funciona bien si escribo cada comando en la Terminal con gcc -o file1 file1.c && gcc file2.c -lm -o file2
, y luego ./file1 someArgs ./file2 someArgs
2) También funciona si escribo en Terminal: make rst y make res
3) No funciona escribiendo make
en Terminal
Makefile:
all: check default: check clean: rm -rf file1 file2 rst: gcc -o file1 file1.c && gcc file2.c -lm -o file2 res: ./file1 someArgs ./file2 someArgs check: make clean make rst make res
También probé:
all: check default: check clean: rm -rf file1 file2 rst: gcc -o file1 file1.c && gcc file2.c -lm -o file2 res: ./file1 someArgs ./file2 someArgs check: clean rst res
Y algunas otras combinaciones con o sin make
. Todo el mismo error:
make: check: Command not found Makefile:2: recipe for target 'all' failed make: *** [all] Error 127
Parece que tiene cierta confusión entre los requisitos previos de una regla de creación y su receta. Los requisitos previos van en la misma línea que el nombre del objetivo; la receta va en la siguiente línea o líneas con tabulación. Así, por ejemplo, esta regla...
all: check
... dice que el objetivo 'todo' no tiene requisitos previos (por lo que siempre se considera desactualizado), y que la receta para construirlo es ejecutar una check
de comando . Lo que parece que realmente quiere es construir el objetivo llamado 'verificar', lo que puede hacer que suceda haciendo que 'verificar' sea un requisito previo de 'todos':
all: check
En términos más generales, parece que se está acercando al archivo MAKE como si fuera un programa con múltiples puntos de entrada, pero se ve mucho mejor como un conjunto de reglas make
puede usar Make para construir cosas. Por lo tanto, es convencional y deseable que las reglas que realmente crean un archivo especifiquen el archivo creado como destino. Además, para usar todo el poder de make
, debe expresar los requisitos previos adecuados para esas y otras reglas. Por ejemplo:
./file1: file1.c gcc -o file1 file1.c ./file2: file2.c gcc file2.c -lm -o file2 res: ./file1 ./file2 ./file1 someArgs ./file2 someArgs
Si lo hace correctamente, entonces no necesita trucos como eliminar y reconstruir los programas cada vez: make
descubrirá si están desactualizados y los reconstruirá cuando sea necesario.
El primer objetivo all
tratando de ejecutar un comando llamado check
(y también lo es el objetivo default
). Creo que desea que el comando make
se comporte igual que el comando make check
y que realice las acciones del objetivo llamado check
en el Makefile. En ese caso, agréguelo como una dependencia como esta:
all: check default: check clean: rm -rf file1 file2 rst: gcc -o file1 file1.c && gcc file2.c -lm -o file2 res: ./file1 someArgs ./file2 someArgs check: make clean make rst make res