2009-04-20 25 views
26

La última frase en el article me llamó la atención¿Cuál es la diferencia entre make y gcc?

[F] o/desarrolladores de C++ y C estudiantes interesados ​​en aprender a programa en C/C++ en lugar de usuarios de Linux . Esto se debe a que la compilación del código fuente se simplifica en GNU/Linux mediante el uso del comando 'make' .

Siempre he usado gcc para compilar mis programas C/C++, mientras que javac para compilar mis programas Java. Solo he usado make para instalar programas en mi computadora mediante configure/make/make install.

Parece que puede compilar aparentemente todos sus programas con el comando make.

¿Cuál es la diferencia entre make y gcc?

+0

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. –

Respuesta

52

Bueno ... gcc es un compilador, make es una herramienta para ayudar a crear programas. La diferencia es enorme Nunca puedes construir un programa utilizando puramente make; no es un compilador ¿Qué marca introduce un archivo separado de "reglas" que describe cómo pasar del código fuente al programa finalizado?Luego interpreta este archivo, se da cuenta de lo que se debe compilar y llama a gcc por usted. Esto es muy útil para proyectos más grandes, con cientos o miles de archivos de código fuente, y para realizar un seguimiento de cosas como las opciones del compilador, incluir rutas, etc.

+0

¡Gracias por tu respuesta! –

+0

Haga que ya no necesite un archivo MAKE para aplicaciones simples de un solo archivo. Si tiene el archivo 'application.cpp',' make application' lo compilará. –

+0

@LokiAstari ¿Entonces no hay diferencia entre usar make o gcc para un solo archivo? Cuando uso gcc, obtengo un archivo .out pero make da un archivo con el mismo nombre y sin extensión. ¿Cuál es la diferencia? – Manoj

13

gcc compila y/o enlaza un solo archivo. Es compatible con varios idiomas, pero no sabe cómo combinar varios archivos fuente en un programa en ejecución no trivial; por lo general, necesitará al menos dos invocaciones de gcc (compilación y enlace) para crear incluso el más simple de los programas.

página de Wikipedia sobre GCC lo describe como un "sistema de compilador":

La colección de compiladores de GNU (comúnmente abreviado como GCC) es un sistema compilador producido por el Proyecto GNU apoyar diversos lenguajes de programación.

hacen es una "herramienta de construcción" que invoca el compilador (que podría ser gcc) en una secuencia determinada para recopilar múltiples fuentes y vincularlos entre sí. También realiza un seguimiento de las dependencias entre varios archivos de origen y objetos que resultan de la compilación de orígenes y solo realiza las operaciones en los componentes que han cambiado desde la última compilación.

GNUmake es una implementación popular de make. La descripción de GNUmake es la siguiente:

Make es una herramienta que controla la generación de archivos ejecutables y otros archivos no fuente de un programa desde los archivos fuente del programa.

Make obtiene su conocimiento de cómo crear su programa a partir de un archivo llamado makefile, que enumera cada uno de los archivos no fuente y cómo calcularlo desde otros archivos.

4

Make es una herramienta para construir cualquier sistema complejo donde existan dependencias entre los diversos componentes del sistema, mediante la mínima cantidad de trabajo necesario.

Si quiere descubrir todas las cosas que se pueden usar para hacer, la GNU make manual es excelente.

5

Make menudo utiliza gcc para compilar una multitud de archivos de C o C++.

3

Puede usar make para compilar sus programas C y C++ llamando a gcc o g ++ en su archivo MAKE para realizar todos los pasos de compilación y enlace, lo que le permite hacer todos estos pasos con un simple comando. No es un reemplazo para el compilador.

4

make usa un Makefile en el directorio actual para aplicar un conjunto de reglas a sus argumentos de entrada. Make también conoce algunas reglas predeterminadas para que se ejecute incluso si no encuentra un archivo Makefile (o similar) en el directorio actual. La regla para ejecutar para los archivos cpp pasa a llamar al gcc en muchos sistemas.

Tenga en cuenta que usted no llama make con los entrada de nombres de archivo, sino más bien con nombres de las reglas que reflejan la salida . Así llamando make xyz se esforzará para ejecutar la regla xyz que por defecto genera un archivo xyz (por ejemplo basado en un archivo de código fuente xyz.cpp.

3

gcc es un compilador como javac. Le das archivos de origen, le da un programa.

make Se necesita un archivo que describa cómo crear los archivos en su proyecto en función de las dependencias entre los archivos, de modo que cuando cambie un archivo fuente, no tenga que reconstruir todo (como si utilizó una secuencia de comandos de compilación). make generalmente usa gcc para compilar realmente archivos fuente.

+0

Como dije en un comentario a la pregunta del OP: javac es más que solo un compilador y realiza comprobaciones de dependencia basadas en reglas incorporadas (que son simples debido a la correspondencia ruta/nombre vs. paquete/clase de Java). –

2

'gcc' es el compilador, el programa que realmente convierte el código fuente en un ejecutable. Tienes que decir dónde está el código fuente, qué salida, y varias otras cosas como bibliotecas y opciones.

'make' es más como un lenguaje de scripting para compilar programas. Es una manera de ocultar todos los detalles de la compilación de su fuente (todos los argumentos que tiene que pasar el compilador). Usted script todos los detalles anteriores una vez en el Makefile, por lo que no tiene que escribirlo cada vez para cada archivo. También hará cosas ingeniosas como solo recompilar archivos fuente que se han actualizado y manejar dependencias (si recompilo este archivo, necesitaré recompilar ESO archivo).

11

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.

+1

Compararía "make" y "gcc" con "git" y "ftp-transfer" en la tecnología de red .: git es como make (solo actualiza los archivos modificados si quieres, que es el caso de uso común) y gcc like ftp (cambiando todo) – Timo

4

make es esencialmente un sistema experto para el código de construcción. Establece reglas sobre cómo se construyen las cosas y de qué dependen. Make puede mirar las marcas de tiempo en todos sus archivos y descubrir exactamente qué necesita reconstruir en cualquier momento.

gcc es la "colección de compilador gnu". Hay muchos idiomas que admite (C, C++, Ada, etc., dependiendo de su configuración), pero aún así es solo una herramienta de las que muchos pueden hacer para construir su sistema.

1

La mayor diferencia es que make está completo (Are makefiles Turing complete?) mientras que gcc no lo está.

+0

¡Esta es una excelente comparación entre los dos! –

Cuestiones relacionadas