gcc es un compilador de C: toma una C el archivo fuente y crea el código máquina, ya sea en forma de archivos de objetos no vinculados o como un programa ejecutable real, que se ha vinculado a todos los módulos de objetos y bibliotecas.
make es útil para controlar el proceso de compilación de un proyecto. Un programa C típico consiste en varios módulos (.c) y archivos de encabezado (.h). Tomaría mucho tiempo compilar siempre todo después de cambiar algo, por lo que make está diseñado para compilar solo las partes que necesitan volver a compilarse después de un cambio.
Hace esto siguiendo las reglas creadas por el programador. Por ejemplo:
foo.o: foo.c foo.h
cc -c foo.c
Esta regla dice que la hacen foo.o archivo depende del foo.c archivos y comida.h, y si alguno de ellos cambia, se puede generar ejecutando el comando en la segunda línea. (Lo anterior no es una sintaxis real: make quiere los comandos sangrados por un TAB caracteres, lo que no puedo hacer en este modo de edición. Sin embargo, imagine que está ahí)
make lee sus reglas de un archivo que generalmente llamado un Makefile. Como estos archivos están (tradicionalmente) escritos a mano, make tiene mucha magia para permitirle acortar las reglas. Por ejemplo, sabe que un foo.o se puede construir desde un foo.c, y sabe cuál es el comando para hacerlo. Por lo tanto, la regla anterior podría reducirse a esto:
foo.o: foo.h
Un pequeño programa que consta de tres módulos podría tener un Makefile así:
mycmd: main.o foo.o bar.o
$(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o
foo.o: foo.h bar.h
bar.o: bar.h
maquillaje puede hacer más que sólo compila los programas. Un Makefile típico tendrá una regla para limpiar los archivos no deseados:
clean:
rm -f *.o core myapp
Otra regla podría ejecutar las pruebas:
check: myapp
./myapp <test.input> test.output
diff -u test.correct test.output
Un Makefile podría documentación "acumulación": ejecutar una herramienta para convertir la documentación de algunas marcas lenguaje a HTML y PDF, por ejemplo.
Un Makefile puede tener una regla de instalación para copiar el programa binario que construye donde el usuario o el administrador del sistema lo quiera instalar.
Y así sucesivamente. Debido a que make es genérico y poderoso, normalmente se usa para automatizar todo el proceso desde el desempaquetado de un tarball de origen hasta el punto en que el software está listo para ser utilizado por el usuario.
Hay mucho que aprender sobre make si quieres aprenderlo completamente. La versión GNU de make tiene una documentación particularmente buena: http://www.gnu.org/software/make/manual/ lo tiene en varias formas.
Cabe señalar que javac comprende una resolución de dependencia rudimentaria, es decir, también es una marca simple. Buscará recursivamente (fuentes de) clases utilizadas por otras clases y las compilará cuando sea necesario, incluso si no se mencionaron como argumentos. Los compiladores o enlazadores de C no hacen eso, en parte porque la conexión entre la biblioteca de archivos de objeto y las fuentes no puede inferirse de la forma en que lo hacen en Java, donde los nombres y las rutas de los archivos físicos corresponden a los nombres y paquetes de clases lógicas. –