CMake і vcpkg

Перший проєкт з CMake: конфігурація, збірка, запуск

Мінімальний CMakeLists.txt, збірка за схемою out-of-source, вміст папки build, команди cmake -S -B та cmake --build, вибір генератора.

Перший проєкт з CMake: конфігурація, збірка, запуск

🎯 Мета лекції

  • Створити мінімальний CMake-проєкт із одним файлом і зібрати його.
  • Розрізняти етапи конфігурації та збірки й знати, яка команда за що відповідає.
  • Розуміти, чому збірка виконується в окремій папці build/, і що в ній лежить.
  • Вибирати генератор за допомогою прапорця -G.

🔑 Ключові терміни

  • Out-of-source build: збірка, при якій згенеровані файли лежать окремо від вихідного коду.
  • Конфігурація (configure): етап, на якому CMake читає CMakeLists.txt і генерує файли збірки.
  • Ціль (target): результат збірки (виконуваний файл або бібліотека), який описується в CMakeLists.txt.
  • Кеш CMake: файл CMakeCache.txt із запам'ятованими налаштуваннями.

У попередній лекції з'ясували, що CMake генерує файли для системи збірки. Тепер ця схема перевіряється на найменшому можливому проєкті: одна програма в одному файлі.

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

Проєкт складається з двох файлів. У main.cpp лежить код програми, у CMakeLists.txt — опис того, як із нього зробити виконуваний файл.

Файл CMakeLists.txt має саме таку назву, з урахуванням регістру. CMake шукає його в папці, яку ви вказали як початкову.

Розбір CMakeLists.txt рядок за рядком

Файл складається з чотирьох команд. Кожна команда CMake має вигляд ім'я(аргументи).

cmake_minimum_required(VERSION 3.10)

Задає найнижчу версію CMake, з якою проєкт гарантовано збереться. Якщо у користувача CMake старіший, він побачить зрозуміле повідомлення замість незрозумілих помилок про невідомі команди.

project(HelloCMake)

Оголошує назву проєкту. Вона потрапляє в змінну ${PROJECT_NAME} і в назви згенерованих файлів (наприклад, HelloCMake.sln у Visual Studio). Саме під час виклику project() CMake шукає компілятор.

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

Перша змінна вибирає стандарт C++ (допустимі значення: 11, 14, 17, 20, 23). Друга змінна забороняє «тихо» знижувати стандарт. Без неї старий компілятор мовчки збере проєкт зі старішим стандартом, і помилки з'являться лише в коді.

add_executable(HelloCMake main.cpp)

Створює ціль: виконуваний файл HelloCMake (на Windows HelloCMake.exe), який збирається з main.cpp. Перший аргумент — ім'я цілі, далі йдуть джерела.

Ім'я цілі й назва проєкту — різні речі. Тут вони збігаються для простоти, але project(Shop) може містити цілі shop-server і shop-client.

Збірка проєкту

CMake рекомендує збирати проєкт в окремій папці, а не поруч з вихідними файлами. Такий підхід називають out-of-source build. Повний цикл складається з трьох кроків:

# 1. Перейдіть у папку проєкту
cd HelloCMake

# 2. Згенеруйте файли збірки в папку build
cmake -S . -B build

# 3. Скомпілюйте
cmake --build build

# 4. Запустіть
./build/HelloCMake

Ось що виводить CMake на кожному кроці. Перший крок:

cmake -S . -B build
$ cmake -S . -B build
-- The C compiler identification is AppleClang 21.0.0.21000334
-- The CXX compiler identification is AppleClang 21.0.0.21000334
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features - done
-- Configuring done (1.2s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/student/HelloCMake/build

Другий і третій:

збірка і запуск
$ cmake --build build
[ 50%] Building CXX object CMakeFiles/HelloCMake.dir/main.cpp.o
[100%] Linking CXX executable HelloCMake
[100%] Built target HelloCMake
$ ./build/HelloCMake
Привіт, CMake!
Моя перша програма з CMake

Що робить кожна команда

  1. cmake -S . -B build читає CMakeLists.txt із папки . (прапорець -S, source), визначає компілятор і створює файли збірки в папці build (прапорець -B, binary). Це етап конфігурації.
  2. cmake --build build запускає ту систему збірки, для якої CMake згенерував файли (make, Ninja, MSBuild). Система компілює .cpp в об'єктні файли .o і лінкує їх у програму.
  3. ./build/HelloCMake запускає результат. Це вже звичайна програма, CMake у цьому не бере участі.

Класичний варіант із cd build

Прапорці -S і -B з'явилися у CMake 3.13. У старіших матеріалах і на старих системах зустрінете такий запис:

mkdir build
cd build
cmake ..
make

Команда cmake .. робить те саме, що cmake -S .. -B .: джерела беруться з батьківської папки, а поточна папка стає папкою збірки. Обидва варіанти еквівалентні.

Команда cmake --build працює однаково з будь-яким генератором. Тому у скриптах і документації краще писати її замість make або msbuild: інструкція не залежить від платформи.

Що лежить у папці build

Після конфігурації та збірки в build/ з'являється таке:

Об'єктПризначення
CMakeCache.txtКеш налаштувань: шлях до компілятора, значення опцій, CMAKE_BUILD_TYPE
CMakeFiles/Внутрішні службові файли CMake, об'єктні файли (.o)
cmake_install.cmakeСкрипт для команди cmake --install
MakefileЗгенерований файл для make (Linux, macOS)
HelloCMake.slnРішення Visual Studio (Windows, якщо обрано цей генератор)
HelloCMakeГотова програма

Реальний склад залежить від генератора: з Visual Studio замість Makefile будуть .sln і .vcxproj, а з Ninja з'явиться build.ninja.

Чому збірка виконується в окремій папці

  • Чисте дерево вихідного коду. Файли збірки не змішуються з .cpp і .h, тому git status не засмічується.
  • Чиста збірка за секунду. Папку build/ можна видалити повністю, і наступна конфігурація почнеться з нуля. Видалення окремих згенерованих файлів серед вихідних було б ризикованим.
  • Кілька збірок одночасно. Поруч можуть лежати build-debug/ і build-release/ з різними налаштуваннями, і вони не заважають одна одній.
Команда cmake . без -B виконує збірку в самому дереві джерел (in-source build). Усе згенероване змішується з кодом, а видалити його без git clean складно. Користуйтеся -S і -B.

Одна команда замість кількох

Конфігурацію і збірку можна запустити в один рядок:

cmake -S . -B build && cmake --build build && ./build/HelloCMake

Оператор && виконує наступну команду лише тоді, коли попередня завершилась успішно. Якщо конфігурація впала з помилкою, збірка не стартує.

Вибір генератора

Якщо генератор не вказано, CMake обирає його сам: Unix Makefiles на Linux і macOS, найновіший Visual Studio на Windows. Явно вибрати можна прапорцем -G:

cmake -S . -B build -G "Ninja"
cmake -S . -B build -G "Unix Makefiles"
cmake -S . -B build -G "Visual Studio 17 2022"
cmake -S . -B build -G "Xcode"

Список доступних генераторів виводить команда cmake --help в її кінці.

Генератори з однією і кількома конфігураціями

Генератори поділяються на два типи:

ТипПрикладиДе задається Debug/Release
Single-configMakefiles, NinjaНа етапі конфігурації: -DCMAKE_BUILD_TYPE=Release
Multi-configVisual Studio, Xcode, Ninja Multi-ConfigНа етапі збірки: --config Release

Через це на Windows виконуваний файл лежить у build/Debug/, а на Linux прямо в build/. Детальніше про типи збірки йдеться в окремій лекції.

Якщо змінити генератор для вже існуючої папки build, CMake видасть помилку: «Does not match the generator used previously». Видаліть build/ або вкажіть іншу папку.

Типові помилки на першому проєкті

Практичне завдання

Резюме

📄 Мінімальний проєкт

Чотири команди в CMakeLists.txt: cmake_minimum_required, project, стандарт C++ і add_executable.

🔁 Два етапи

cmake -S . -B build генерує файли, cmake --build build компілює. Запуск програми від CMake не залежить.

🗂️ Окрема папка

Out-of-source збірка тримає код чистим, дозволяє видалити build/ і мати кілька збірок поруч.

🧰 Генератори

Прапорець -G вибирає систему збірки. Single-config і multi-config генератори по-різному задають Debug і Release.
У наступній лекції розглянемо синтаксис CMakeLists.txt докладніше: команди project, set, message, вбудовані змінні, списки і коментарі.
Copyright © 2026