Flujo de construcción de CMake

El flujo de construcción de CMake se divide en varios pasos principales, desde crear el directorio de construcción hasta ejecutar la compilación, y luego limpiar y reconfigurar.

Todo el proceso gira en torno al archivo de configuración CMakeLists.txt. CMake lee la configuración y genera archivos de construcción adecuados para la plataforma actual.


Resumen del flujo de construcción

Un flujo de construcción completo de CMake incluye los siguientes cinco pasos clave, cada uno con su función y comandos específicos.

Paso Operación Comando Descripción
1 Crear directorio de construcción mkdir build && cd build Usar el método Out-of-source para mantener limpio el directorio del código fuente
2 Generar archivos de construcción cmake .. Leer CMakeLists.txt y generar Makefile / Ninja / .sln, etc.
3 Compilar y construir cmake --build . Ejecutar el proceso real de compilación y enlace
4 Limpiar archivos de construcción cmake --build . --target clean Eliminar los archivos intermedios y los archivos objeto generados por la compilación
5 Reconfigurar y construir cmake .. && cmake --build . Regenerar y compilar después de cambios en CMakeLists.txt

CMake 构建流程图


Explicación detallada del flujo de construcción

A continuación se detallan las operaciones específicas y las opciones comunes de cada paso.

Crear directorio de construcción

CMake recomienda usarOut-of-sourceel método de construcción (fuera del código fuente), es decir, colocar los archivos de construcción en un directorio independiente fuera del directorio del código fuente.

Este método mantiene limpio el directorio del código fuente y admite configurar múltiples esquemas de construcción diferentes para el mismo código fuente (como Debug y Release en paralelo).

Utilice siempre el método de construcción Out-of-source. Ejecutar cmake directamente en el directorio del código fuente contaminará la estructura del proyecto, los archivos intermedios generados son difíciles de limpiar y tampoco es fácil cambiar entre tipos de construcción.

Out-of-source 构建方式示意图

Crear directorio de construcción:

# 在项目根目录下创建 build 目录
mkdir build

Entrar al directorio de construcción:

# 切换到构建目录,后续所有 cmake 命令在此执行
cd build

Generar archivos de construcción

Ejecutar CMake en el directorio de construcción, leer CMakeLists.txt del directorio del código fuente y generar los archivos del sistema de construcción adecuados para la plataforma actual.

CMake admite múltiples generadores de sistemas de construcción, como Unix Makefiles, Ninja, Visual Studio, Xcode, etc.

Uso básico: generar archivos de construcción predeterminados:

# .. 指向包含 CMakeLists.txt 的源代码目录
cmake ..

Especificar el generador:

Usar-Gel parámetro puede especificar el tipo de sistema de construcción a generar.

# 使用 Ninja 作为构建系统(速度比 Make 更快)
cmake -G "Ninja" ..

Especificar el tipo de construcción:

Usar-DCMAKE_BUILD_TYPEel parámetro establece el nivel de optimización de compilación y la información de depuración.

# 四种常见的构建类型:Debug / Release / RelWithDebInfo / MinSizeRel
cmake -DCMAKE_BUILD_TYPE=Release ..

Verificar el resultado de la configuración:

CMake mostrará información detallada durante el proceso de configuración, incluidos los compiladores detectados, las bibliotecas encontradas, las opciones definidas, etc.

Si no hay errores, los archivos del sistema de construcción se generarán en el directorio de construcción actual.

Si ocurre un error durante la configuración (como no encontrar una biblioteca especificada), CMake se detendrá y mostrará un mensaje de error. Después de resolver el error, vuelva a ejecutar el comando cmake para continuar.

Compilar y construir

Una vez generados los archivos de construcción, se puede ejecutar el proceso real de compilación y enlace.

Diferentes sistemas de construcción usan diferentes comandos de compilación; también puede usar el comando de construcción universal proporcionado por CMake.

Método recomendado: usar el comando de construcción universal de CMake:

# 无论底层使用哪种构建系统,该命令都能正确编译
cmake --build .

Construir un objetivo específico:

# 只编译指定的目标(如某个可执行文件或库)
cmake --build . --target MyExecutable

Usar el sistema de construcción Makefile:

# 编译所有目标
make

# 使用多核并行编译(-j 参数指定并行任务数)
make -j$(nproc)

# 编译特定目标
make MyExecutable

Usar el sistema de construcción Ninja:

# Ninja 自动并行编译,无需手动指定 -j
ninja

# 编译特定目标
ninja MyExecutable

Usar Visual Studio:

Si se generaron archivos de proyecto de Visual Studio, puede abrir.slnel archivo de solución y seleccionar Generar solución en el IDE.

# 也可以使用 MSBuild 命令行工具编译
msbuild MyProject.sln /p:Configuration=Release

Limpiar archivos de construcción

Los archivos intermedios (.o, .obj, etc.) y los archivos objeto generados durante la compilación se pueden eliminar mediante una operación de limpieza para liberar espacio en disco.

Usar el comando de limpieza universal de CMake:

cmake --build . --target clean

Usar Makefile:

make clean

Usar Ninja:

ninja clean

Limpieza manual:

# 删除构建目录中的所有文件,保留源代码目录不变
rm -rf build/*

La forma más simple y completa de limpiar es eliminar directamente todo el directorio build, luego recrearlo y ejecutar cmake. Esto es más confiable que ejecutar clean por separado, porque el objetivo clean puede no estar definido correctamente.

Reconfigurar y construir

Cuando modifique el archivo CMakeLists.txt o ajuste la configuración del proyecto, debe volver a ejecutar la configuración de CMake y recompilar.

Reconfigurar:

# CMake 会自动检测变更的文件,只重新生成受影响的部分
cmake ..

Recompilar:

# 编译系统会自动识别哪些源文件发生了变更,只重新编译改动的部分
cmake --build .

En la mayoría de los casos, después de modificar CMakeLists.txt, simplemente ejecute cmake --build . El sistema de construcción detectará automáticamente los cambios en CMakeLists.txt y volverá a ejecutar el paso de configuración de cmake.


Comparación de sistemas de construcción

CMake admite la generación de múltiples archivos de sistema de construcción. A continuación se muestra una comparación de los tres sistemas de construcción más utilizados.

Sistema de construcción Plataforma aplicable Compilación paralela Características
Unix Makefiles Linux / macOS Debe especificarse manualmente-j La mayor compatibilidad, casi todos los sistemas Unix lo incluyen.
Ninja Multiplataforma Paralelo automático Más rápido, especialmente adecuado para compilación incremental y proyectos grandes.
Visual Studio Windows Gestión automática por IDE Integración profunda con el IDE de VS, soporta depuración y configuración gráfica.

Precauciones

Utilice siempre la construcción Out-of-source.Ejecutar cmake en el directorio del código fuente generará muchos archivos intermedios y contaminará el control de versiones. Agregar el directorio build a .gitignore es una buena práctica.

Priorice el uso del comando cmake --build .Este comando es una entrada de construcción universal multiplataforma que funciona correctamente ya sea que el backend sea Make, Ninja o MSBuild. Es especialmente recomendado en scripts y entornos de CI.

El tipo de construcción afecta el rendimiento y la experiencia de depuración.El modo Debug incluye símbolos de depuración y no optimiza, adecuado para desarrollo; el modo Release habilita la optimización y elimina la información de depuración, adecuado para despliegue en producción. No use el modo Debug para probar el rendimiento ni el modo Release para depurar código.

Cuando encuentre errores de construcción extraños, elimine el directorio build y empiece de nuevo.A veces la caché de CMake conserva información de configuración obsoleta, lo que causa errores difíciles de diagnosticar. Eliminar todo el directorio build y volver a ejecutar cmake es la forma más rápida de solucionarlo.

Otras extensiones