Процесс сборки CMake

Процесс сборки CMake делится на несколько основных этапов: от создания каталога сборки до выполнения компиляции, затем очистки и повторной настройки.

Весь процесс строится вокруг файла конфигурации CMakeLists.txt. После чтения конфигурации CMake генерирует файлы сборки, подходящие для текущей платформы.


Обзор процесса сборки

Полный процесс сборки CMake включает следующие пять ключевых этапов, каждый со своей конкретной целью и командами.

Шаг Действие Команда Описание
1 Создать каталог сборки mkdir build && cd build Используйте метод Out-of-source, чтобы каталог исходников оставался чистым
2 Сгенерировать файлы сборки cmake .. Прочитать CMakeLists.txt, сгенерировать Makefile / Ninja / .sln и т. д.
3 Скомпилировать и собрать cmake --build . Выполнить фактический процесс компиляции и компоновки
4 Очистка файлов сборки cmake --build . --target clean Удалить промежуточные файлы и объектные файлы, созданные во время компиляции
5 Переконфигурировать и собрать cmake .. && cmake --build . После изменений в CMakeLists.txt выполнить повторную генерацию и перекомпиляцию

CMake 构建流程图


Подробный процесс сборки

Ниже описаны конкретные операции и распространённые параметры для каждого шага.

Создать каталог сборки

CMake рекомендует использоватьOut-of-source(вне исходного каталога) метод сборки, то есть размещать файлы сборки в отдельном каталоге вне каталога исходного кода.

Такой подход сохраняет каталог исходного кода чистым и при этом поддерживает несколько различных конфигураций сборки из одного и того же исходного кода (например, одновременное существование Debug и Release).

Всегда используйте метод сборки Out-of-source. Запуск cmake непосредственно в каталоге исходного кода загрязняет структуру проекта, из-за чего созданные промежуточные файлы становится трудно очистить, а переключение типов сборки — неудобным.

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

Создайте каталог сборки:

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

Перейдите в каталог сборки:

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

Сгенерировать файлы сборки

Запустите CMake в каталоге сборки, прочитайте CMakeLists.txt в каталоге исходного кода и сгенерируйте файлы системы сборки, подходящие для текущей платформы.

CMake поддерживает несколько генераторов систем сборки, таких как Unix Makefiles, Ninja, Visual Studio, Xcode и т. д.

Базовое использование — создание файлов сборки по умолчанию:

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

Укажите генератор:

Используйте-GПараметр может указывать тип генерируемой системы сборки.

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

Укажите тип сборки:

Используйте-DCMAKE_BUILD_TYPEПараметр задаёт уровень оптимизации компиляции и отладочную информацию.

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

Проверьте результат конфигурации:

Во время конфигурации CMake выведет подробную информацию, включая обнаруженный компилятор, найденные библиотеки, определённые параметры и т. д.

Если ошибок нет, файлы системы сборки будут созданы в текущем каталоге сборки.

Если во время конфигурации возникает ошибка (например, не удаётся найти указанную библиотеку), CMake прервёт работу и выведет сообщение об ошибке. После устранения ошибки повторно запустите команду cmake, чтобы продолжить.

Скомпилировать и собрать

После создания файлов сборки можно выполнить сам процесс компиляции и компоновки.

В разных системах сборки используются разные команды компиляции; также можно использовать универсальную команду сборки, предоставляемую CMake.

Рекомендуемый способ — использовать универсальную команду сборки CMake:

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

Сборка конкретной цели:

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

Использование системы сборки Makefile:

# 编译所有目标
make

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

# 编译特定目标
make MyExecutable

Использование системы сборки Ninja:

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

# 编译特定目标
ninja MyExecutable

Использование Visual Studio:

Если создан файл проекта Visual Studio, можно открыть.sln(файл решения) и выбрать Build Solution в IDE.

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

Очистка файлов сборки

Промежуточные файлы (.o, .obj и т. д.) и объектные файлы, созданные в процессе сборки, можно удалить с помощью операции clean, чтобы освободить место на диске.

Используйте универсальную команду clean в CMake:

cmake --build . --target clean

Использование Makefile:

make clean

Использование Ninja:

ninja clean

Ручная очистка:

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

Самый простой и самый тщательный способ очистки — удалить весь каталог сборки, затем создать его заново и запустить cmake. Это надёжнее, чем просто запустить clean, потому что цель clean может быть определена неправильно.

Переконфигурировать и собрать

После изменения файла CMakeLists.txt или настроек проекта необходимо повторно запустить конфигурацию CMake и перекомпилировать.

Переконфигурировать:

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

Перекомпилировать:

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

В большинстве случаев после изменения CMakeLists.txt можно просто выполнить cmake --build . Система сборки автоматически обнаружит изменения в CMakeLists.txt и повторно выполнит шаг конфигурации cmake.


Сравнение систем сборки

CMake может создавать файлы систем сборки нескольких типов. Ниже приведено сравнение трёх наиболее часто используемых систем сборки.

Система сборки Применимые платформы Параллельная компиляция Особенности
Unix Makefiles Linux / macOS Требуется ручное указание-j Наиболее широкая совместимость; встроена почти во все Unix-системы
Ninja Кроссплатформенный Автоматическая параллелизация Более высокая скорость, особенно подходит для инкрементальной компиляции и крупных проектов
Visual Studio Windows Автоматическое управление IDE Глубокая интеграция с VS IDE, поддержка графической отладки и настройки

Примечания

Всегда используйте сборку вне исходного каталога.Запуск cmake в исходном каталоге создаёт множество промежуточных файлов и загрязняет систему контроля версий. Добавление каталога сборки в .gitignore — лучшая практика.

Предпочитайте команду cmake --build .Эта команда является кроссплатформенной универсальной точкой входа для сборки и корректно работает независимо от того, используется ли в основе Make, Ninja или MSBuild. Особенно рекомендуется в скриптах и средах CI.

Тип сборки влияет на производительность и опыт отладки.Режим Debug включает отладочные символы и не выполняет оптимизацию, подходит для разработки; режим Release включает оптимизацию и удаляет отладочную информацию, подходит для развёртывания в продакшене. Не используйте режим Debug для тестирования производительности и не используйте режим Release для отладки кода.

При возникновении странных ошибок сборки удалите каталог сборки и начните заново.Кэш CMake иногда может сохранять устаревшую информацию о конфигурации, что приводит к ошибкам, которые трудно диагностировать. Удаление всего каталога сборки и повторный запуск cmake — самый быстрый способ устранения неполадок.

Другие расширения