lunes, 30 de julio de 2012

Taller C/C++. Makefile

Bueno, creo que lo más simple ya queda claro, además de que es algo que se ha tratado en miles de páginas web con mayor o menor acierto.

Ahora vamos a pasar a algo más complejo que puede llegar a ser un infierno si  no se hace uso de un IDE de desarrollo.

Los ficheros Makefile:

Los ficheros Makefile son ficheros de texto que funcionan como scripts, a los que se llama cuando queremos compilar una aplicación sin tener que escribir toda la linea de texto que llama al compilador con todas sus opciones. Son muy útiles cuando nuestros programas van cogiendo cierta envergadura. Es facil olvidar la opción que mejor nos iba con gcc, o uno de los muchisimos ficheros que componen el proyecto.

Un ejemplo sencillo de Makefile puede ser simplemente escribir dentro de un fichero la linea con la que compilamos un proyecto. gcc -o ejecutable main.cpp
pero se puede llegar a compliar la cosa hasta puntos insospechados, con Makefiles que comprueban la existencia de las librerías que se usan dentro de nuestro código, la ruta de acceso, borrar el compilado anterior de tu programa, instalar el programa...

Para ayudar en la realización de un Makefile, explicaré uno creado por mí, y que cubre bastante bien las necesidades de un desarrollador medio:

#    @author Gabriel

#Definicion de constantes
NOMBRE = bloguero
VERSION = 0.1.5
AUTOR = Gabriel
FECHA = 10/11/2011
COMPILADOR = g++
OPCIONES = -g -Wall -O2
LIBRERIAS = -lm -lpthread
OBJETOS = utm.o poli.o bloguer.o
MAIN = main.cpp

#Genera todo el programa
all: escribe principal
   
escribe:
    @echo ;
    @echo VERSION: $(VERSION);
    @echo AUTHOR: $(AUTOR);
    @echo NAME:  $(NOMBRE);
    @echo ;

#Enlazado con las clases y generacion del ejecutable
principal: $(OBJETOS)
    $(COMPILADOR) -o $(NOMBRE) $(OPCIONES) $(MAIN) $(OBJETOS) $(LIBRERIAS)

#Realiza el compilado de las clases
$(OBJETOS) : %.o : %.cpp %.h
    $(COMPILADOR) -c $(BANDERAS) $< -o $@ 

Aquí se imprimen los datos del programador y del programa, además de realizar la compilación en 2 partes. Dado que esta escrito en castellano, creo que no será dificil de entender que es lo que hace, pero explicaré una parte concreta que puede ser la más liosa.

Al final del fichero se observa como se hace referencia a unos %.o %.cpp %.h En realidad, esto hace que se compilen los ficheros cuyos nombres correspondan a los que están en la lista OBJETOS, y cuyas extensiones sean .cpp .h

Este Makefile es para un proyecto de C++. La sección LIBRERIAS se indica para especificar que librerías se usan dentro de nuestro código fuente, en este caso las de matemáticas -lmath y las de posix -lpthread (necesarias para programar con hilos y que espero poder explicar en un futuro). Pero si en tu proyecto no se hace uso de ninguna librería, no es necesario indicar nada.

Si tu proyecto tiene algunos ficheros que solo tienen .cpp y no su correspondiente .h, tendría que añadirse a mano en la seccion principal, escrito trás $(MAIN). Si se observa detenidamente, con unas simples sustituciones se obtienen sentencias similares a:  

g++ -o -O2 bloguero main.cpp utm.o poli.o bloguer.o -lm -lpthread

Es posible insertar otras opciones, que hacen referencia a la localización de ficheros de cabecera .h que no se encuentran en el habitual /usr/local/include ¿Cómo lo hacemos? indicando lo siguiente: -I ruta_include Ejem. -I /opt/include

Por último mencionar la opción que ayuda al compilador (si somos estrictos al enlazador) a encontrar librerías que no se encuentran instaladas en el lugar por defecto: -L ruta_librería Ejem. -L /opt/lib

Para finalizar, decir que el fichro Makefile debe encontrarse en el mismo directorio donde están los fuentes de tu programa, y para ejecutarlo solo hay que escribir en el terminal: ~$ make  ó ~$make all

No hay comentarios: