Ú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:
Si usas llvm, puedes consultar esto:
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.
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 ejecutableCMAKE_EXE_LINKER_FLAGS_RELEASE: flags usados por el enlazador al crear el ejecutable de la versión releaseCMAKE_EXE_LINKER_FLAGS_DEBUG: flags usados por el enlazador al crear el ejecutable de la versión debugCMAKE_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¶
- Construir proyectos C++ con Bazel | C++那些事
- Depuración conjunta de Bazel y LLDB | C++那些事
- Introducción a Conan, gestor de paquetes de C++ | C++那些事
- C++ Insights: observación en tiempo de compilación | C++那些事
- C++ Jupyter Notebook interactivo | C++那些事
- Convertir string a int en C++ | C++那些事
- dbg-macro, macro de depuración para C++ | C++那些事
- Explicación detallada de las opciones de compilación de GCC | C++那些事
- Depurar programas C++ con GDB | C++那些事
- Depuración con la extensión Python de GDB | C++那些事