Usar CMAKE para compilar proyectos en C++

En este breve artículo vamos a mostrar cómo usar CMAKE para compilar programas de cualquier complejidad.

Para ello vamos a utilizar la herramienta g++ como compilador (en el resto de ejemplos vamos a tratar de usar siempre g++).

Comencemos por generar un archivo de código fuente en C++ como el ejemplo que se presenta a continuación:

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
  
  return 0;
}

Si necesitas una breve introducción a C++ puedes empezar por aquí.

Llama a este archivo de código fuente hello.cpp.

Ahora necesitarás un archivo CMAKE por lo que puedes crear uno escribiendo lo siguiente desde la consola:

touch Makefile

Con el siguiente contenido:

CC = g++
all: hello
hello: hello.o
      ${CC} -o hello hello.o
hello.o: hello.cpp
      ${CC} -c hello.cpp
clean: 
      rm hello.o hello

Es importante señalar que se deben usar tabulaciones en vez de espacios para indentar los comandos.

A pesar de que se trata de un simple programa Hello World! el ejemplo resulta útil para ver como se estructura un archivo makefile.

De forma simplificada, se puede decir que un archivo makefile define una serie de reglas, que se componen de prerrequisitos y comandos.

La primera regla, all, tiene como prerrequisito a hello. Esta regla carece de comando.

La segunda regla, hello, tiene como prerrequisito a hello.o y como comando:

${CC} -o hello hello.o

La tercera regla, hello.o, tiene como prerrequisito al archivo hello.cpp y un comando para compilar:

${CC} -c hello.cpp

La última regla, clean, tiene como comando una instrucción para eliminar tanto hello como hello.o forzando así una nueva compilación en la próxima ejecución.

Ahora por lo tanto podríamos compilar el programa sin problemas mediante el archivo makefile que hemos creado introduciendo el comando:

make

Lo cuál nos dejaría el binario compilado y enlazado, solamente tendríamos que ejecutarlo con:

./hello

Este ejemplo únicamente nos ha mostrado unos conceptos muy básicos sobre los archivos makefile y la utilidad make. Otros casos de uso más complejos son:

  • Uso de macros: Un makefile permite el uso de macros, que aparecen como variables. Éstas a su vez pueden ser usadas para dar más modularidad al makefile, como por ejemplo:
    • Macros para las librerías dinámicas usadas en el programa: LIBS = -lasd -lfgh
    • Macro para el compilador: COMPILER = GCC
    • Puedes usar como referencia esas macros en cualquier parte del makefile: ${COMPILER} o ${LIBS}
  • Cuando tecleas make en la terminal, la primera regla definida el el makefile será ejecutada. En nuestro ejemplo era all. Si lo hubiéramos cambiado por clean por ejemplo se habría ejecutado esa regla. Como norma general siempre es deseable ejecutar make con algún parámetro a continuación, por ejemplo: make clean.

¡Si tienes alguna pregunta no dudes en dejar tus comentarios!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.