CMake і vcpkg

CMake: навіщо він потрібен і як його встановити

Проблема ручної компіляції на різних платформах, ідея генератора систем збірки, переваги CMake, встановлення CMake та компілятора на Windows, Linux і macOS.

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

Прапорці /EHsc та /Fe: існують лише в MSVC, а -o не працює в cl. Одну й ту саму ідею («скомпілюй ці файли в програму myapp») доводиться записувати тричі. Для проєкту, який збирають і на ноутбуці студента з Windows, і на сервері з Linux, це перша незручність.

Що ламається на практиці

Незручність платформ — лише перша з п'яти проблем ручного підходу:

  1. Різні команди для різних платформ. Скрипт збірки для Linux не запрацює на Windows, і навпаки.
  2. Новий файл — нова правка команди. Додали logger.cpp — треба дописати його в кожну команду у кожному скрипті, інакше лінкер видасть помилку «undefined reference».
  3. Великі проєкти не масштабуються. Коли файлів сотні, а бібліотек десятки, рядок команди перетворюється на нечитабельну стіну тексту.
  4. Підключення бібліотек. Для кожної бібліотеки треба вручну вказати папку із заголовками (-I), папку з бінарниками (-L) і ім'я бібліотеки (-l). На кожній платформі ці шляхи інші.
  5. Зміна компілятора. Перейти з 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. Офіційний інсталятор.

  1. Завантажте інсталятор «Windows x64 Installer» зі сторінки cmake.org/download.
  2. Запустіть його.
  3. На кроці вибору параметрів оберіть Add CMake to the system PATH. Без цього команда cmake не знайдеться в терміналі.

Спосіб 2. Менеджер пакетів.

choco install cmake
winget install Kitware.CMake
PPA ppa:ubuntu-toolchain-r/test, яку іноді радять для оновлення CMake, призначена для нових версій GCC. Гарантії свіжого CMake вона не дає. Для оновлення використовуйте інсталятор із сайту, pip або репозиторій Kitware.

Перевірка встановлення

cmake --version
cmake --version
$ cmake --version
cmake version 4.2.0
CMake suite maintained and supported by Kitware (kitware.com/cmake).

Номер версії у вас може відрізнятися. Головне, щоб команда знайшлася і не видала помилку «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.

Ninja: швидша система збірки

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

# Linux
sudo apt install ninja-build

# macOS
brew install ninja

# Windows
choco install ninja

Питання для самоперевірки

Резюме

🧩 Проблема

Ручні команди компіляції залежать від платформи та компілятора, потребують правки при кожному новому файлі й не масштабуються.

⚙️ Рішення

CMake за описом у CMakeLists.txt генерує файли для Make, Ninja, Visual Studio або Xcode. Компілює вже система збірки.

📦 Встановлення

Потрібні два компоненти: CMake і компілятор C++. Перевірка: cmake --version.
У наступній лекції створимо перший проєкт: напишемо мінімальний CMakeLists.txt, пройдемо повний цикл «конфігурація → збірка → запуск» і розберемося, що лежить у папці build/.
Copyright © 2026