c makefile tutorial
En este tutorial de C ++ Makefile, discutiremos los aspectos principales de la herramienta Make y Makefile, incluidas sus ventajas y aplicaciones en C ++:
En cualquier proyecto de C ++, uno de los objetivos importantes es simplificar la construcción del proyecto para que obtengamos todas las dependencias y archivos del proyecto en un solo lugar y los ejecutemos de una vez para obtener el resultado deseado con un solo comando.
diferencia en c y c ++
Al mismo tiempo, cada vez que se modifica alguno de los archivos del proyecto, no tenemos que pasar por la molestia de construir el proyecto completo nuevamente, es decir, cada vez que se modifican uno o dos archivos en el proyecto, reconstruimos solo estos archivos modificados y luego procedemos con la ejecución.
=> Lea la serie de formación Easy C ++.
Estas son exactamente las características que se abordan con la herramienta 'make' y los 'makefiles' en C ++. En este tutorial, discutiremos todos los aspectos principales de los archivos MAKE, así como sus aplicaciones en C ++.
Lo que vas a aprender:
Hacer herramienta
Make es una herramienta de UNIX y se utiliza como herramienta para simplificar la creación de ejecutables desde diferentes módulos de un proyecto. Hay varias reglas que se especifican como entradas de destino en el archivo MAKE. La herramienta make lee todas estas reglas y se comporta en consecuencia.
Por ejemplo, si una regla especifica alguna dependencia, entonces la herramienta de creación incluirá esa dependencia para propósitos de compilación. El comando make se utiliza en el archivo MAKE para crear módulos o limpiar los archivos.
La sintaxis general de make es:
|_+_|Por ejemplo , si queremos ejecutar comandos rm para limpiar archivos, escribimos:
% make clean #aquí limpio es un target_label especificado para los comandos rm
Makefile de C ++
Un archivo MAKE no es más que un archivo de texto que es usado o referenciado por el comando 'make' para construir los objetivos. Un archivo MAKE también contiene información como las dependencias a nivel de fuente para cada archivo, así como las dependencias del orden de construcción.
Ahora veamos la estructura general de Makefile.
Un archivo MAKE normalmente comienza con declaraciones de variables seguidas de un conjunto de entradas de destino para construir destinos específicos. Estos destinos pueden ser .o u otros archivos ejecutables en C o C ++ y archivos .class en Java.
También podemos tener un conjunto de entradas de destino para ejecutar un conjunto de comandos especificados por la etiqueta de destino.
Entonces, un archivo MAKE genérico es el que se muestra a continuación:
|_+_|A continuación se muestra un ejemplo simple del archivo MAKE.
|_+_|En el archivo MAKE anterior, hemos especificado dos etiquetas de destino, la primera es la etiqueta 'todos' para construir ejecutables a partir de archivos de objeto myprogram y mylib. La segunda etiqueta de destino 'limpiar' elimina todos los archivos con el nombre 'myprogram'.
Veamos otra variación del archivo MAKE.
|_+_|Como se muestra en el ejemplo anterior, en este archivo MAKE utilizamos la variable 'CC' que contiene el valor del compilador que estamos usando (GCC en este caso). Otra variable 'CFLAGS' contiene los indicadores del compilador que usaremos.
La tercera variable 'TARGET' contiene el nombre del programa para el que necesitamos construir el ejecutable.
La ventaja de la medida de esta variación del archivo MAKE es que solo necesitamos cambiar los valores de las variables que hemos usado siempre que haya algún cambio en el compilador, los indicadores del compilador o el nombre del programa ejecutable.
Ejemplo de Make y Makefile
Considere un ejemplo de programa con los siguientes archivos:
- Main.cpp: Programa de controlador principal
- Punto.h: Archivo de encabezado para clase de puntos
- Point.cpp: Archivo de implementación CPP para clase de puntos
- Cuadrado.h: Archivo de encabezado para clase cuadrada
- Square.cpp; Archivo de implementación CPP para clase cuadrada
Con los archivos .cpp y .h dados anteriormente, necesitamos compilar estos archivos por separado para generar archivos .o y luego vincularlos al ejecutable llamado main.
A continuación, compilamos estos archivos por separado.
- g ++ -c main.cpp: genera main.o
- g ++ -c punto.cpp: genera un punto. o
- g ++ -c cuadrado.cpp: genera cuadrado. o
A continuación, vinculamos los archivos objeto para generar el ejecutable principal.
g ++ -o principal principal.o punto.o cuadrado.o
A continuación, debemos decidir cuál de los archivos tendremos que recompilar y regenerar cuando se actualicen ciertas partes del programa. Para esto, tendremos un gráfico de dependencia que muestra varias dependencias para cada uno de los archivos de implementación.
A continuación se muestra el cuadro de dependencia de los archivos anteriores.
Entonces, en la tabla de dependencias anterior, podemos ver el ejecutable 'main' en la raíz. El ejecutable 'principal' consta de archivos objeto a saber. main.o, point.o, square.o que se genera compilando main.cpp, point.cpp y square.cpp respectivamente.
Todas las implementaciones de cpp usan archivos de encabezado como se muestra en el gráfico anterior. Como se muestra arriba, main.cpp hace referencia a point.hy square.h ya que es el programa controlador y usa clases de punto y cuadrado.
El siguiente archivo point.cpp hace referencia a point.h. El tercer archivo square.cpp hace referencia a square.h así como al point.h, ya que también necesitará un punto para dibujar el cuadrado.
De la tabla de dependencias anterior, está claro que cada vez que cambia cualquier archivo .cpp o .h al que hace referencia el archivo .cpp, debemos volver a generar ese archivo .o. Por ejemplo, cuando main.cpp cambia, necesitamos volver a generar main.o y vincular los archivos de objeto nuevamente para generar el ejecutable principal.
Todas las explicaciones anteriores que hemos dado funcionarán sin problemas si hay pocos archivos en el proyecto. Cuando el proyecto es enorme y los archivos son grandes y demasiados, es difícil volver a generar los archivos repetidamente.
Por lo tanto, optamos por hacer archivos y usamos para hacer una herramienta para construir el proyecto y generar el ejecutable.
Ya hemos visto varias partes de un archivo make. Tenga en cuenta que el archivo debe llamarse 'MAKEFILE' o 'makefile' y debe colocarse en la carpeta de origen.
Ahora escribiremos el archivo MAKE para el ejemplo anterior.
Definiremos variables para contener los valores del compilador y las banderas del compilador como se muestra a continuación.
|_+_|Luego creamos el primer objetivo en nuestro archivo MAKE, es decir, el ejecutable main. Entonces escribimos un objetivo con sus dependencias.
main: main.o point.o square.o
Por lo tanto, el comando para generar este objetivo es
|_+_|Nota: El comando anterior en realidad se traduce en g ++ -wall –g –o main main.o point.o square.o
Nuestro próximo objetivo será generar archivos objeto, main.o, point.o, square.o
Ahora para generar main.o, el destino se escribirá como:
|_+_|El comando para este objetivo es:
|_+_|El siguiente archivo point.o se puede generar usando el siguiente comando:
|_+_|En el comando anterior, hemos omitido point.cpp. Esto se debe a que make ya sabe que los archivos .o se generan a partir de los archivos .cpp, por lo que solo .h (incluir archivo) es suficiente.
Del mismo modo, se puede generar square.o con el siguiente comando.
|_+_|El archivo MAKE completo de este ejemplo se verá como se muestra a continuación:
|_+_|Por lo tanto, vemos que tenemos un archivo MAKE completo que compila tres archivos C ++ y luego genera un archivo principal ejecutable a partir de los archivos objeto.
Ventajas de Makefiles
- Cuando se trata de grandes proyectos, el uso de archivos MAKE nos ayuda a representar el proyecto de una manera sistemática y eficiente.
- Los archivos Makefiles hacen que el código fuente sea más conciso y fácil de leer y depurar.
- Makefiles compila automáticamente solo aquellos archivos que se modifican. Por lo tanto, no necesitamos regenerar todo el proyecto cuando se modifican algunas de las partes del proyecto.
- La herramienta Make nos permite compilar varios archivos a la vez para que todos los archivos se puedan compilar en un solo paso.
Conclusión
Los archivos Makefiles son una bendición para el desarrollo de software. Usando un archivo MAKE C ++, podemos construir soluciones en menos tiempo. Además, cuando se modifica una parte del proyecto, el archivo MAKE vuelve a compilar y regenera solo esa parte sin tener que regenerar todo el proyecto.
C ++ Makefile nos permite representar el proyecto de manera sistemática y eficiente, haciéndolo más legible y fácil de depurar.
En este tutorial de C ++ Makefile, hemos visto makefile y herramientas de creación en detalle. También hemos discutido cómo escribir un archivo MAKE desde cero.
=> Consulte la guía de formación perfecta de C ++ aquí.
Lectura recomendada
- 70+ MEJORES Tutoriales de C ++ para aprender programación C ++ GRATIS
- Dev C ++ IDE: instalación, características y desarrollo C ++
- Una descripción completa de C ++
- Objetos de archivo VBScript: CopyFile, DeleteFile, OpenTextFile, Leer y escribir archivo de texto
- Tutorial de manejo de archivos de Python: cómo crear, abrir, leer y escribir
- Comandos del sistema de archivos Unix Touch, Cat, Cp, Mv, Rm, Mkdir (Parte B)
- 12 mejores IDE y editores de código de Python en 2021
- Los 15 mejores editores de código gratuitos para una experiencia de codificación perfecta