CMake: навіщо він потрібен і як його встановити
CMake: навіщо він потрібен і як його встановити
🎯 Мета лекції
- Зрозуміти, які проблеми виникають при ручній компіляції багатофайлових проєктів.
- З'ясувати, що саме робить CMake і чим він відрізняється від компілятора та від
make. - Встановити CMake і компілятор C++ на Windows, Linux або macOS та перевірити встановлення.
🔑 Ключові терміни
- Система збірки (build system): програма, що знає, які файли і в якому порядку компілювати та лінкувати.
- Генератор (generator): частина CMake, яка створює файли для конкретної системи збірки (Makefile,
.sln, Ninja). CMakeLists.txt: єдиний текстовий опис проєкту, з якого CMake все генерує.- Кросплатформність (cross-platform): один опис проєкту працює на Windows, Linux і macOS.
Цей матеріал відкриває розділ про CMake. Раніше ми збирали програми однією командою компілятора, а в темі про багатофайлові програми розділяли код на .h і .cpp. Поки файлів два-три, команду компіляції можна записати вручну. Нижче розглянуто, на якому масштабі цей підхід перестає працювати.
Проблема ручної компіляції
Припустимо, програма на C++ складається з п'яти файлів: main.cpp, math_utils.cpp, math_utils.h, string_utils.cpp і string_utils.h. Щоб отримати виконуваний файл, потрібно передати компілятору всі .cpp. Заголовки компілятор підтягне сам через #include.
Проблема в тому, що в кожної платформи свій компілятор зі своїм синтаксисом команд:

cl /EHsc main.cpp math_utils.cpp string_utils.cpp /Fe:myapp.exe
g++ main.cpp math_utils.cpp string_utils.cpp -o myapp
clang++ main.cpp math_utils.cpp string_utils.cpp -o myapp
Прапорці /EHsc та /Fe: існують лише в MSVC, а -o не працює в cl. Одну й ту саму ідею («скомпілюй ці файли в програму myapp») доводиться записувати тричі. Для проєкту, який збирають і на ноутбуці студента з Windows, і на сервері з Linux, це перша незручність.
Що ламається на практиці
Незручність платформ — лише перша з п'яти проблем ручного підходу:
- Різні команди для різних платформ. Скрипт збірки для Linux не запрацює на Windows, і навпаки.
- Новий файл — нова правка команди. Додали
logger.cpp— треба дописати його в кожну команду у кожному скрипті, інакше лінкер видасть помилку «undefined reference». - Великі проєкти не масштабуються. Коли файлів сотні, а бібліотек десятки, рядок команди перетворюється на нечитабельну стіну тексту.
- Підключення бібліотек. Для кожної бібліотеки треба вручну вказати папку із заголовками (
-I), папку з бінарниками (-L) і ім'я бібліотеки (-l). На кожній платформі ці шляхи інші. - Зміна компілятора. Перейти з GCC на Clang означає переписати всі прапорці.
make частково розв'язує другу і третю проблему: він перекомпільовує лише змінені файли. Але Makefile пишеться під конкретну систему, а на Windows із Visual Studio його не використовують. Тому потрібен інструмент рівнем вище.Що таке CMake
CMake — це інструмент, який автоматизує збірку проєктів на C++. Важливо розуміти, що CMake сам нічого не компілює. Він читає опис проєкту з файлу CMakeLists.txt і генерує файли для системи збірки, яка вже є на вашій платформі. Саму компіляцію виконує make, Ninja або Visual Studio.

Тому CMake називають генератором систем збірки (meta build system). Роль кожної ланки видно в таблиці:
| Ланка | Що робить | Приклад |
|---|---|---|
| Компілятор | Перетворює .cpp на об'єктні файли, а далі на програму | GCC, Clang, MSVC |
| Система збірки | Вирішує, які файли перекомпілювати, і викликає компілятор | make, Ninja, MSBuild |
| Генератор (CMake) | Створює файли для системи збірки з єдиного опису | CMakeLists.txt → Makefile |
CMakeLists.txt можна використати і для Visual Studio, і для Ninja, і для Xcode. Змінюється тільки аргумент -G у команді конфігурації. Детальніше про це в наступній лекції.Переваги CMake
- Кросплатформність. Один
CMakeLists.txtпрацює на всіх платформах, де є CMake і компілятор. - Автоматизація. Команди компіляції та лінкування CMake складає сам за описом цілей.
- Масштабованість. Проєкт ділиться на підпапки, кожна зі своїм
CMakeLists.txt, а CMake збирає їх у єдине ціле. - Стандарт індустрії. Більшість професійних C++ проєктів використовує CMake, тому вміння читати
CMakeLists.txtпотрібне в будь-якій команді. - Інтеграція з IDE. Visual Studio, CLion і VS Code відкривають CMake-проєкти напряму, без окремих файлів проєкту.
- Керування залежностями. Через
find_package,FetchContentі менеджери пакетів (vcpkg, Conan) підключення бібліотек зводиться до кількох рядків.
Хто використовує CMake
З CMake збираються Qt (GUI-фреймворк), OpenCV (комп'ютерний зір), LLVM/Clang (компілятор), MySQL (база даних), KDE (графічне середовище для Linux) і Blender (3D-графіка). Тобто один інструмент справляється і з бібліотекою на кілька файлів, і з проєктом на мільйони рядків.
Встановлення CMake
CMake розповсюджується як звичайна програма. Для курсу потрібна версія 3.15 або новіша, а краще остання стабільна.
Спосіб 1. Офіційний інсталятор.
- Завантажте інсталятор «Windows x64 Installer» зі сторінки cmake.org/download.
- Запустіть його.
- На кроці вибору параметрів оберіть Add CMake to the system PATH. Без цього команда
cmakeне знайдеться в терміналі.
Спосіб 2. Менеджер пакетів.
choco install cmake
winget install Kitware.CMake
На Ubuntu та Debian:
sudo apt update
sudo apt install cmake
Репозиторій дистрибутива часто містить застарілу версію. Якщо потрібна новіша, є три надійні шляхи:
# 1. Офіційний інсталятор з GitHub (підставте актуальну версію)
wget https://github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1-linux-x86_64.sh
sudo sh cmake-3.28.1-linux-x86_64.sh --prefix=/usr/local --skip-license
# 2. Через pip (не потребує прав адміністратора)
pip install cmake
# 3. Через snap
sudo snap install cmake --classic
Спосіб 1. Homebrew (рекомендовано).
brew install cmake
Спосіб 2. Офіційний інсталятор. Завантажте образ із cmake.org/download, перетягніть CMake в «Програми» і запустіть один раз, щоб згенерувати символічні посилання командою «Install For Command Line Use» з меню Tools.
ppa:ubuntu-toolchain-r/test, яку іноді радять для оновлення CMake, призначена для нових версій GCC. Гарантії свіжого CMake вона не дає. Для оновлення використовуйте інсталятор із сайту, pip або репозиторій Kitware.Перевірка встановлення
cmake --version
Номер версії у вас може відрізнятися. Головне, щоб команда знайшлася і не видала помилку «command not found».
Встановлення компілятора
CMake компілятора не містить. Якщо його немає, CMake на етапі конфігурації видасть помилку «No CMAKE_CXX_COMPILER could be found».
- Visual Studio (редакція Community безкоштовна) з компонентом «Desktop development with C++». Це MSVC, найтісніша інтеграція з CMake.
- MinGW-w64 — порт GCC для Windows. Зручний, якщо потрібен
g++без Visual Studio. - Clang — окремі збірки LLVM або Clang, що йде у складі Visual Studio.
sudo apt install build-essential
Пакет build-essential ставить GCC, g++ і make.
xcode-select --install
Команда ставить Apple Clang і утиліти командного рядка. Повний Xcode для цього не потрібен.
Ninja: швидша система збірки
make вистачає для навчальних проєктів. Для великих проєктів популярний Ninja: він швидше визначає, що перекомпілювати, і краще розпаралелює роботу. CMake підтримує його як генератор.
# Linux
sudo apt install ninja-build
# macOS
brew install ninja
# Windows
choco install ninja
Питання для самоперевірки
Makefile, .sln, Ninja-файли). Компілює вже система збірки, яка викликає компілятор. Тому CMake називають генератором.Makefile потребує утиліти make, а вона у Windows із Visual Studio не використовується. Крім того, прапорці в Makefile прописані для конкретного компілятора. CMake підставляє правильні прапорці та формат файлів залежно від платформи.cmake. Програма встановлена, але викликати її можна лише за повним шляхом. Виправлення: додати папку bin з CMake у змінну PATH вручну або перевстановити з потрібною галочкою.Резюме
🧩 Проблема
⚙️ Рішення
CMakeLists.txt генерує файли для Make, Ninja, Visual Studio або Xcode. Компілює вже система збірки.📦 Встановлення
cmake --version.CMakeLists.txt, пройдемо повний цикл «конфігурація → збірка → запуск» і розберемося, що лежить у папці build/.Спільне володіння: std::shared_ptr та std::weak_ptr
Підрахунок посилань, циклічні залежності, блок управління та слабкі вказівники. Розумні покажчики для складних графів об\
Перший проєкт з CMake: конфігурація, збірка, запуск
Мінімальний CMakeLists.txt, збірка за схемою out-of-source, вміст папки build, команди cmake -S -B та cmake --build, вибір генератора.