Перший проєкт з CMake: конфігурація, збірка, запуск
Перший проєкт з 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
cd HelloCMake
cmake -S . -B build
cmake --build build --config Debug
.\build\Debug\HelloCMake.exe
З Visual Studio виконуваний файл лежить у підпапці конфігурації (Debug або Release). Причину пояснимо нижче, у розділі про multi-config генератори.
Ось що виводить CMake на кожному кроці. Перший крок:
Другий і третій:
Що робить кожна команда
cmake -S . -B buildчитаєCMakeLists.txtіз папки.(прапорець-S, source), визначає компілятор і створює файли збірки в папціbuild(прапорець-B, binary). Це етап конфігурації.cmake --build buildзапускає ту систему збірки, для якої CMake згенерував файли (make, Ninja, MSBuild). Система компілює.cppв об'єктні файли.oі лінкує їх у програму../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-config | Makefiles, Ninja | На етапі конфігурації: -DCMAKE_BUILD_TYPE=Release |
| Multi-config | Visual Studio, Xcode, Ninja Multi-Config | На етапі збірки: --config Release |
Через це на Windows виконуваний файл лежить у build/Debug/, а на Linux прямо в build/. Детальніше про типи збірки йдеться в окремій лекції.
build, CMake видасть помилку: «Does not match the generator used previously». Видаліть build/ або вкажіть іншу папку.Типові помилки на першому проєкті
CMakeLists.txt у папці, яку ви вказали через -S (або в ..). Перевірте, чи ви запускаєте команду з правильної папки і чи файл названий саме CMakeLists.txt: з великих літер, у множині, без зайвого розширення .txt.txt.PATH. Встановіть компілятор (див. першу лекцію розділу), а потім видаліть build/ і повторіть конфігурацію, бо CMake запам'ятав невдалий результат пошуку в кеші.cmake --build build: система збірки помітить, що CMakeLists.txt змінився, і сама повторно запустить конфігурацію. Окремий виклик cmake -S . -B build потрібен, коли ви хочете передати нові опції (-D...) або змінити генератор.build\Debug\HelloCMake.exe. Щоб зібрати Release, виконайте cmake --build build --config Release, і файл з'явиться в build\Release\.Практичне завдання
- Створіть папку
HelloCMakeіз двома файлами:main.cppіCMakeLists.txtз цієї лекції. - Змініть повідомлення в
main.cppна власне. - Збудуйте проєкт у папці
build, запустіть програму. - Видаліть папку
buildі повторіть збірку однією командою. - Змініть стандарт C++ на 20 і знову зберіть проєкт. Переконайтеся, що збірка проходить.
build/ немає нічого, що не можна відтворити. Якщо компілятор у вас старий і не підтримує C++20, завдяки CMAKE_CXX_STANDARD_REQUIRED CMake зупиниться з помилкою замість мовчазного пониження стандарту.Резюме
📄 Мінімальний проєкт
CMakeLists.txt: cmake_minimum_required, project, стандарт C++ і add_executable.🔁 Два етапи
cmake -S . -B build генерує файли, cmake --build build компілює. Запуск програми від CMake не залежить.🗂️ Окрема папка
build/ і мати кілька збірок поруч.🧰 Генератори
-G вибирає систему збірки. Single-config і multi-config генератори по-різному задають Debug і Release.CMakeLists.txt докладніше: команди project, set, message, вбудовані змінні, списки і коментарі.CMake: навіщо він потрібен і як його встановити
Проблема ручної компіляції на різних платформах, ідея генератора систем збірки, переваги CMake, встановлення CMake та компілятора на Windows, Linux і macOS.
Синтаксис CMakeLists.txt: команди, змінні, списки
Основні команди CMake (cmake_minimum_required, project, set, add_executable, add_library, target_link_libraries, message), вбудовані й власні змінні, списки, коментарі та повний приклад конфігурації.