Saltar a contenido

Última actualización:2026-10-12

CMake: introducción y práctica

Lo esencial de CMake (parte uno)

1. Establecer los flags del compilador

Por ejemplo: establecer el estándar de C++ y mostrar todas las advertencias.

set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall")
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>")

También se pueden establecer algunos flags de optimización

Documentación oficial: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Por ejemplo:

-O0, -O1, -O2, -O3

Si usas llvm, puedes consultar esto:

https://clang.llvm.org/docs/DiagnosticsReference.html

2. Establecer propiedades de los archivos fuente

Esta es una función compleja de CMake: si existen varios objetivos, puede que necesites cambiar el comportamiento de uno de ellos. Por ejemplo, si quieres compilar main.cpp con C++11 pero, al generar solo la biblioteca, quizá prefieras construirla con C++14. En ese caso, puedes usar el comando set_source_files_properties para configurar las propiedades de archivos fuente concretos, así:

cmakeCopy code
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11")

En el siguiente manual puedes consultar una gran cantidad de propiedades, y cada una de ellas puede usarse para satisfacer tus necesidades concretas.

https://cmake.org/cmake/help/v3.3/manual/cmake-properties.7.html#source-file-properties

3. Flags del enlazador

A continuación, una lista de flags del enlazador para el enlazador de GNU GCC.

Opciones de enlace de GNU GCC

https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Por defecto, el enlazador de GCC puede buscar en los directorios definidos en las variables de entorno (/usr/lib;/usr/local/lib) y después enlaza las bibliotecas estándar por defecto.

Uno de los flags más comunes es -l, usado para enlazar las bibliotecas necesarias, como -lzlib, -lboost, etc.

Existen otros flags adicionales que te ayudan a cambiar el comportamiento de las opciones de enlazado del ejecutable.

Estas son las variables en las que puedes añadir flags del enlazador:

  • CMAKE_EXE_LINKER_FLAGS: flags usados por el enlazador al crear el ejecutable
  • CMAKE_EXE_LINKER_FLAGS_RELEASE: flags usados por el enlazador al crear el ejecutable de la versión release
  • CMAKE_EXE_LINKER_FLAGS_DEBUG: flags usados por el enlazador al crear el ejecutable de la versión debug
  • CMAKE_STATIC_LINKER_FLAGS: flags usados por el enlazador al crear bibliotecas estáticas (.a, .lib)
  • CMAKE_SHARED_LINKER_FLAGS: flags usados por el enlazador al crear bibliotecas compartidas (.so, .dll)
  • CMAKE_MODULE_LINKER_FLAGS: flags usados por el enlazador al crear bibliotecas de módulos

Por ejemplo, puedes añadir flags del enlazador con el siguiente código:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl")

Saber usar estos flags te ayuda a controlar mejor el comportamiento de enlazado del ejecutable.

4. Paquetes Debug y Release

Dentro del archivo CMakeLists.txt se puede acceder a CMAKE_BUILD_TYPE. Puedes comprobar fácilmente el tipo de compilación en CMakeLists.txt:

if(${CMAKE_BUILD_TYPE} MATCHES Debug)
    message("Debug Build")
elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
    message("Release Build")
endif()

También puedes usar las variables de configuración mostradas en la sección anterior para establecer por separado los flags del compilador y del enlazador para los distintos tipos de compilación:

  • CMAKE_EXE_LINKER_FLAGS_RELEASE: flags para crear el ejecutable de la versión release
  • CMAKE_EXE_LINKER_FLAGS_DEBUG: flags para crear el ejecutable de la versión debug
  • CMAKE_CXX_FLAGS_RELEASE
  • CMAKE_CXX_FLAGS_DEBUG

Temas relacionados

Comentarios