← Назад к вопросам

Что такое CMake?

2.0 Middle🔥 211 комментариев
#Сборка и инструменты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

CMake: система управления сборкой

Определение

CMake — это кроссплатформенная система управления сборкой (build system) для C/C++ проектов. Он генерирует платформо-специфичные файлы сборки (Makefile, Visual Studio project, Xcode project и т.д.) из одного описания проекта.

Вместо того, чтобы писать Makefile для Linux, .vcproj для Windows и project.pbxproj для macOS, ты пишешь один CMakeLists.txt файл.

Проблема, которую решает CMake

Без CMake разработчики должны были вручную управлять:

  • Путями к include файлам на разных ОС
  • Путями к библиотекам на разных ОС
  • Порядком компиляции
  • Зависимостями между файлами
  • Разными компиляторами

Это создавало кошмар для кроссплатформенной разработки!

Решение CMake

CMake абстрагирует эту сложность. Один файл — все платформы:

cmake_minimum_required(VERSION 3.10)
project(MyApp)

set(CMAKE_CXX_STANDARD 17)

add_executable(myapp main.cpp)
target_include_directories(myapp PRIVATE include)
target_link_libraries(myapp PRIVATE boost)

CMake автоматически:

  • Определяет, какую ОС и компилятор использует
  • Генерирует подходящий Makefile или проект
  • Находит библиотеки на этой системе
  • Кросс-компилирует для целевой платформы

История

CMake был создан в 2000-х годах для проекта ITK. Стал стандартом в C++ разработке, используется в Boost, Qt, OpenCV, LLVM/Clang, TensorFlow.

Как это работает: 3 этапа

Этап 1: Configuration (Конфигурация)

cmake -S . -B build
# или
mkdir build && cd build && cmake ..

CMake читает CMakeLists.txt и создаёт в папке build файлы проекта: CMakeCache.txt, Makefile, cmake_install.cmake.

Этап 2: Build (Сборка)

cmake --build build
# или
cd build && make

CMake использует сгенерированный Makefile для компиляции.

Этап 3: Install (Установка)

cmake --install build
# или
cd build && make install

Устанавливает сгенерированные бинарники и библиотеки в систему.

Пример CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(MyProject VERSION 1.0.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(SOURCES
    src/main.cpp
    src/utils.cpp
    src/logger.cpp
)

find_package(Boost REQUIRED COMPONENTS system filesystem)
find_package(OpenSSL REQUIRED)

add_executable(myapp ${SOURCES})

target_include_directories(myapp PRIVATE include)

target_link_libraries(myapp
    PRIVATE Boost::system Boost::filesystem
    PRIVATE OpenSSL::Crypto OpenSSL::SSL
)

install(TARGETS myapp DESTINATION bin)

Ключевые команды CMake

add_executable() — создание исполняемого файла

add_executable(myapp main.cpp utils.cpp helper.cpp)

add_library() — создание библиотеки

add_library(mylib STATIC lib.cpp helper.cpp)
add_library(mylib SHARED lib.cpp helper.cpp)

find_package() — поиск внешней библиотеки

find_package(Boost REQUIRED COMPONENTS system filesystem)
find_package(OpenSSL REQUIRED)

target_link_libraries() — линковка библиотек

target_link_libraries(myapp PRIVATE Boost::system OpenSSL::Crypto)

target_include_directories() — пути к заголовкам

target_include_directories(myapp
    PUBLIC include
    PRIVATE src
)

Практический пример

Структура проекта:

MyProject/
├── CMakeLists.txt
├── src/main.cpp
├── src/utils.cpp
├── include/utils.h
└── build/

CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(MyProject)

set(CMAKE_CXX_STANDARD 17)

add_executable(myapp src/main.cpp src/utils.cpp)
target_include_directories(myapp PRIVATE include)

Сборка:

mkdir build && cd build
cmake ..
make
./myapp

CMake vs Make vs Ninja

CMake — генератор сборки, генерирует Makefile или файлы для Ninja.

Make — классическая система сборки, но требует ручной настройки для кроссплатформенности.

Ninja — быстрая система сборки, часто быстрее Make.

Типичный workflow: CMakeLists.txt → CMake → Makefile/Ninja → Компилятор → Бинарник

Преимущества CMake

✅ Кроссплатформенность — один файл для Windows, Linux, macOS ✅ Управление зависимостями — автоматический поиск библиотек ✅ Масштабируемость — удобен как для малых, так и для больших проектов ✅ Интеграция с IDE — Visual Studio, CLion, VS Code ✅ Модульность — разбить большой проект на подмодули

Недостатки CMake

❌ Синтаксис — немного странный язык ❌ Обучение — требует времени на изучение ❌ Отладка — сложно найти ошибку в конфиге

Альтернативы

  • Meson — более современный, быстрый, лучший синтаксис
  • Bazel — Google build system, очень мощный
  • Make — классический, требует ручной работы

Вывод

CMake — стандартная система управления сборкой в C++ разработке. Если ты работаешь с C/C++, нужно его знать. CMake позволяет забыть о различиях между платформами, управлять сложными проектами и легко подключать внешние библиотеки. Это инвестиция времени, которая окупится.

Что такое CMake? | PrepBro