Ответ
CMake — это кроссплатформенная система автоматизации сборки (build system generator). Она не собирает проект напрямую, а генерирует файлы для нативных систем сборки (Makefile для GNU Make, .sln для MSVC, проекты для Xcode и т.д.) на основе скриптов CMakeLists.txt. Это стандартный инструмент для управления сборкой C++ проектов.
Основные преимущества для C++ разработки:
- Кроссплатформенность: Один
CMakeLists.txtможет генерировать проекты для Windows, Linux, macOS. - Управление зависимостями: Поиск системных библиотек (
find_package) и подключение подпроектов. - Контроль флагов компиляции: Централизованная настройка стандартов языка, оптимизаций, предупреждений.
Пример минимального CMakeLists.txt для C++ проекта:
cmake_minimum_required(VERSION 3.16)
project(MyCppApp VERSION 1.0 LANGUAGES CXX)
# Устанавливаем стандарт C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Создаём исполняемый файл из исходных кодов
add_executable(my_app main.cpp src/utils.cpp)
# Подключаем заголовочные директории
target_include_directories(my_app PUBLIC include)
# Связываем с внешней библиотекой (например, Threads)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)
Типичный рабочий процесс:
# 1. Создать отдельную директорию для сборки (out-of-source build)
mkdir build && cd build
# 2. Сгенерировать файлы сборки (например, для Make)
cmake .. -DCMAKE_BUILD_TYPE=Release
# 3. Запустить сборку
cmake --build . -j4
Современный подход (Modern CMake) рекомендует использовать target-ориентированные команды (target_include_directories, target_link_libraries), а не глобальные переменные, что улучшает изоляцию и переносимость целей сборки.
Ответ 18+ 🔞
Слушай, а вот CMake — это такая штука, которая тебе проект не собирает, а делает вид, что она главная. Понимаешь? Она как режиссёр-постановщик на стройке: сама кирпичи не кладёт, но всем указывает, как это делать, и раздаёт чертежи разным прорабам. То есть она генерирует файлы для тех, кто реально пашет: Makefile для линуксового make, .sln для студии под виндой, проекты для Xcode. А вся её мудрость живёт в файлах CMakeLists.txt. Стандарт де-факто, ёпта, в мире C++.
И зачем это всё, спросишь? Ну, преимущества, бля, есть:
- Кроссплатформенность: Один и тот же
CMakeLists.txtможет накормить и линукс, и винду, и мак. Не нужно писать три отдельных скрипта — волнение ебать снимает. - Зависимости: Может сам найти системные библиотеки (
find_package) или прицепить другие твои подпроекты. Не надо руками пути вбивать, как в старые времена. - Флаги компиляции: Всё в одном месте: какой стандарт C++ юзать, какие оптимизации, какие варнинги. Порядок, а не пиздец.
Вот тебе пример самого простого CMakeLists.txt, с которого можно начать:
cmake_minimum_required(VERSION 3.16)
project(MyCppApp VERSION 1.0 LANGUAGES CXX)
# Жёстко говорим, на каком стандарте C++ работаем
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Создаём исполняемый файл из наших исходников
add_executable(my_app main.cpp src/utils.cpp)
# Говорим, где искать заголовочные файлы
target_include_directories(my_app PUBLIC include)
# Цепляем внешнюю библиотеку (например, потоки)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)
А работать с этим обычно нужно так, чувак:
# 1. Создаём отдельную папку для сборки, чтобы не засирать исходники
mkdir build && cd build
# 2. Генерируем нативные файлы сборки (скажем, для Make)
cmake .. -DCMAKE_BUILD_TYPE=Release
# 3. А вот теперь запускаем реальную сборку
cmake --build . -j4
Сейчас все умные ребята используют Modern CMake. Это когда ты работаешь не с глобальными настройками на весь проект, а с конкретными целями (таргетами) через target_include_directories и target_link_libraries. Так надёжнее, чище, и зависимости не расползаются, куда не надо. В общем, не бардак, а цивилизация.