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

В этой статье на примере полного проекта на C++ показано, как с нуля использовать CMake для сборки проекта, содержащего как исполняемые файлы, так и библиотечные файлы.

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


Подготовка проекта

Перед началом сборки сначала создайте файлы проекта и ознакомьтесь со структурой проекта.

Структура проекта

Пример проекта включает исходный файл основной программы, исходный файл библиотеки и заголовочный файл библиотеки. Структура каталогов выглядит следующим образом:

MyProject/
├── CMakeLists.txt          # CMake 配置文件
├── src/
│   ├── main.cpp            # 主程序源文件
│   └── mylib.cpp           # 库源文件
└── include/
    └── mylib.h             # 库头文件
Файл Назначение Описание
CMakeLists.txt Файл конфигурации CMake Определяет правила сборки, цели и зависимости проекта
src/main.cpp Исходный файл основной программы Содержит функцию main(), точку входа программы
src/mylib.cpp Исходный файл библиотеки Реализация функциональности пользовательской библиотеки
include/mylib.h Заголовочный файл библиотеки Объявляет публичный интерфейс библиотеки, который должна включать и использовать основная программа

Файл конфигурации CMakeLists.txt

Создайте файл CMakeLists.txt в корневом каталоге MyProject и запишите следующее содержимое:

Пример

# Путь к файлу: MyProject/CMakeLists.txt

# Укажите минимальную версию CMake (должна быть размещена в первой строке файла)
cmake_minimum_required(VERSION 3.10)

# Определите имя проекта и номер версии
project(MyProject VERSION 1.0)

# Установите стандарт C++ в C++11 и потребуйте, чтобы компилятор его соблюдал
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Добавьте глобальный путь поиска заголовочных файлов
include_directories(${PROJECT_SOURCE_DIR}/include)

# Создайте цель библиотеки MyLib (исходный файл: src/mylib.cpp)
add_library(MyLib src/mylib.cpp)

# Создать исполняемую цель MyExecutable (исходный файл: src/main.cpp)
add_executable(MyExecutable src/main.cpp)

# Связать библиотеку MyLib с исполняемым файлом MyExecutable
target_link_libraries(MyExecutable MyLib)

Назначение каждой директивы в файле конфигурации следующее:

Директива Функция Ключевой момент
cmake_minimum_required(VERSION 3.10) Указать минимальную версию CMake Должна быть размещена в самом начале файла; версии ниже этой приведут к ошибке
project(MyProject VERSION 1.0) Задать имя и версию проекта Номер версии задаёт такие переменные, как PROJECT_VERSION
set(CMAKE_CXX_STANDARD 11) Указать стандарт C++ Использовать вместе с CMAKE_CXX_STANDARD_REQUIRED, чтобы обеспечить его соблюдение
include_directories(...) Добавить путь поиска заголовочных файлов Позволяет компилятору находить заголовочные файлы в include/
add_library(MyLib ...) Создать цель библиотеки Если тип не указан, BUILD_SHARED_LIBS определяет, будет ли она статической или динамической
add_executable(MyExecutable ...) Создать цель исполняемого файла Имя цели будет использоваться как имя итогового сгенерированного исполняемого файла
target_link_libraries(...) Слинковать библиотеку с исполняемым файлом MyExecutable автоматически слинкуется с MyLib во время компиляции

Каждый вызов add_executable и add_library определяетцель сборки (Target).Концепция целей — ядро CMake—последующие команды, такие как target_include_directories, target_link_libraries и т. д., организованы вокруг целей.


Подробные шаги сборки

При наличии CMakeLists.txt выполните сборку и запуск проекта в следующие шесть шагов.

Обзор общего процесса:

Шаг Действие Команда
1 Создать CMakeLists.txt Вручную написать файл конфигурации
2 Создать каталог сборки mkdir build && cd build
3 Настроить проект cmake ..
4 Собрать проект makeилиcmake --build .
5 Запустить исполняемый файл ./MyExecutable
6 Очистить файлы сборки make clean

Создать файл CMakeLists.txt

Создайте файл CMakeLists.txt в корневом каталоге MyProject; его содержимое было приведено в инструкциях по настройке из предыдущего раздела.

Это отправная точка всей сборки CMake; все правила сборки определены в этом файле.

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

Чтобы каталог исходного кода оставался чистым, рекомендуется использоватьвнеисходныйподход к сборке — создайте отдельный каталог сборки в корне проекта.

Откройте терминал и перейдите в каталог MyProject:

# 创建构建目录
mkdir build

# 进入构建目录(后续所有操作都在此目录执行)
cd build

Добавьте каталог build в файл .gitignore, чтобы не добавлять артефакты сборки в систему контроля версий.

Настройка проекта

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

..Укажите каталог с исходным кодом, содержащий CMakeLists.txt.

# 在 build 目录中运行 CMake 配置
cmake ..

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

-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/MyProject/build

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

Компиляция проекта

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

По умолчанию CMake генерирует Makefile в Unix-подобных системах, поэтому можно напрямую использовать команду make.

# 在 build 目录中编译项目
make

После завершения компиляции в каталоге build будут созданы исполняемый файл MyExecutable и файл библиотеки libMyLib.a.

Вы также можете использовать кроссплатформенную универсальную команду сборки:

# cmake --build . 会自动调用正确的底层构建工具
cmake --build .

Запуск исполняемого файла

После успешной сборки запустите сгенерированный исполняемый файл прямо в каталоге сборки.

# 运行编译生成的可执行文件
./MyExecutable

# 预期输出示例
Hello from EXAMPLE! This is MyLib speaking.

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

Операция очистки удаляет промежуточные файлы (файлы .o и т. д.) и целевые файлы, созданные во время компиляции, освобождая место на диске.

Используйте команду make clean:

# 删除编译产生的中间文件和目标文件
make clean

Удалите каталог сборки вручную:

Если правила очистки не определены, можно просто удалить весь каталог сборки.

# 回到项目根目录,删除 build 目录
cd ..
rm -rf build

Удаление всего каталога сборки — самый основательный способ очистки. Для следующей сборки просто повторно выполните mkdir build && cd build && cmake .. && make, чтобы начать с нуля.


Примечания

Убедитесь, что пути к исходным файлам указаны правильно.Пути к исходным файлам в add_executable и add_library задаются относительно каталога, в котором находится CMakeLists.txt. Если пути неверны, на этапе конфигурации CMake ошибка не появится, но при компиляции возникнет ошибка о том, что файлы не найдены.

Имена целей чувствительны к регистру.MyLib и mylib — это разные цели. Имена целей, указанные в target_link_libraries, должны точно совпадать с именами целей, определёнными в add_library.

После изменения CMakeLists.txt требуется повторная конфигурация.Если вы изменили только исходные файлы, просто выполните make; но если вы изменили CMakeLists.txt (например, добавили новые файлы или изменили параметры компиляции), нужно повторно выполнить cmake .. или сразу выполнить cmake --build . (он автоматически обнаружит изменения конфигурации).

Новичкам рекомендуется начинать с простого проекта.Сначала добейтесь работы всего процесса сборки с одним исполняемым файлом, затем постепенно добавляйте библиотеки, внешние зависимости и пользовательские параметры компиляции. Если добавить слишком много всего сразу, будет сложнее устранять ошибки.

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