Пример сборки 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 и запишите следующее содержимое:
Пример
# Укажите минимальную версию 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 . (он автоматически обнаружит изменения конфигурации).
Другие расширенияНовичкам рекомендуется начинать с простого проекта.Сначала добейтесь работы всего процесса сборки с одним исполняемым файлом, затем постепенно добавляйте библиотеки, внешние зависимости и пользовательские параметры компиляции. Если добавить слишком много всего сразу, будет сложнее устранять ошибки.