Сборка и запуск из консоли
Соберёшь проект двумя командами и запустишь свою первую программу.
В папке D:\
- настроить — CMake читает CMakeLists.txt, выясняет, какие инструменты есть на компьютере, и пишет
файлы для сборки ;Файлы, в которых записано, как собирать проект: какие файлы с кодом в него входят и с какими настройками их превращать в программу. Эти файлы читает сборщик, то есть программа, которая запускает компилятор. Какими будут эти файлы, зависит от сборщика, найденного на компьютере: для Visual Studio это.vcxprojи.slnx, для Ninja —build.ninja. CMake кладёт эти файлы в папкуbuild. - собрать — сборщик читает эти файлы и запускает компилятор и линкер, которые делают из кода файл app.exe.
Первая команда: настройка
Вот что CMake пишет по ходу работы.
Что делает команда cmake -S . -B build
PS D:\dev\MyEngine> cmake -S . -B build-- Building for: Visual Studio 18 2026-- Selecting Windows SDK version 10.0.26100.0 to target Windows 10.0.26300.-- The CXX compiler identification is MSVC 19.51.36260.0-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/18/Community/VC/Tools/MSVC/14.51.36231/bin/Hostx64/x64/cl.exe - skipped-- Detecting CXX compile features-- Detecting CXX compile features - done-- Configuring done (1.9s)-- Generating done (0.0s)-- Build files have been written to: D:/dev/MyEngine/build-B задаёт папку сборки. После флага обычно идёт его значение.-B. На схеме папка пока пустая: CMake заполнит папку по ходу вывода. Отдельно — Visual Studio: в ней CMake найдёт всё, что нужно для сборки. Каждая строка вывода начинается с -- — так CMake отмечает свои сообщения..exe.cmake -S . -B build, которую ты запустил, проходит только первую половину. Список дел написан, но MSBuild его ещё не выполнял и компилятор с линкером не запускал, поэтому программы пока нет. Вторую половину пройдёт вторая команда, сборка.main.cpp», сборщики записывают по-разному:- MSBuild — в файле
.vcxproj, на языке разметки XML:<ClCompile Include=“main.cpp” />; - Ninja — в файле
build.ninja:build main.obj: cxx main.cpp; - Make — в файле
Makefile:main.obj: main.cpp.
Visual Studio 18 2026(и более старые версии Visual Studio) — для MSBuild;NinjaиNinja Multi-Config— для Ninja;Unix Makefiles— для Make в Linux и macOS;MinGW MakefilesиNMake Makefiles— для Make-подобных сборщиков в Windows;Xcode— для среды Xcode на macOS.
cmake --help: он в конце, в разделе Generators.project(Engine LANGUAGES CXX)cmake_minimum_required(VERSION 3.28)project(Engine LANGUAGES CXX)add_executable(app main.cpp)Detecting CXX compiler ABI info уже собрала пробную программу компилятором cl.exe, значит компилятор работает, и отдельную проверку CMake пропускает.Configuring done — закончилась первая часть настройки: CMake прочитал CMakeLists.txt до конца и понял, что собирать. Из CMakeLists.txt CMake узнал, что в проекте есть цель cmake_minimum_required(VERSION 3.28)project(Engine LANGUAGES CXX)add_executable(app main.cpp)
Generating done — генерация закончилась: CMake записал в файлы на языке сборщика MSBuild всё, что выяснил при настройке: цель app, которая собирается из main.cpp, компилятор cl.exe и Windows SDK. Предыдущая строка, Configuring done, говорила только о том, что CMake понял, что собирать, а файлов ещё не было. Файлов несколько, главные два:
- app.vcxproj — список дел для сборщика по цели
app. В этом файле записано: перевести main.cpp в машинный код компилятором, затем соединить результат в app.exe. Файл текстовый, и открыть файл можно в Блокноте. Назван по целиappиз твоего CMakeLists.txt; - Engine.slnx — файл
решения . Назван поТак Visual Studio называет набор проектов, которые открываются вместе. Проект в этом смысле — один файл.vcxproj, по которому собирается одна цель: у нас это app.vcxproj. Решение только перечисляет такие файлы. Visual Studio открывает решение, чтобы показать все эти проекты сразу.имени проекта из CMakeLists.txt.EngineИмя задано в строкеproject(Engine …)файла CMakeLists.txt. Так CMake называет весь свой проект, и по этому имени называет файл решения.CMakeLists.txtкоммит 3f85b6a cmake_minimum_required(VERSION 3.28)project(Engine LANGUAGES CXX)add_executable(app main.cpp)
Третий файл, CMakeCache.txt, не список дел, а память CMake. В CMakeCache.txt записано, что CMake выяснил о компьютере: генератор и путь к компилятору. Следующие запуски настройки и сборка читают этот файл и не ищут всё заново.
Кроме app.vcxproj, Engine.slnx и CMakeCache.txt из шага Generating done, в папке лежат:
- ALL_BUILD.vcxproj — «собрать всё»: цель, которая запускает сборку всех остальных;
- ZERO_CHECK.vcxproj — проверка, не изменился ли CMakeLists.txt;
- cmake_install.cmake — шаги установки, нам пока не нужны;
- CMakeFiles — служебная папка CMake.
/, как в Linux. Windows понимает оба варианта.Вторая команда: сборка
Список дел app.vcxproj записан, но программы ещё нет. Вторая команда передаст файлы из папки build сборщику MSBuild, и MSBuild запустит компилятор и линкер.
Вывод короче, чем у настройки, но за ним стоит больше работы.
Что делает cmake --build и кто компилирует проект
PS D:\dev\MyEngine> cmake --build buildВерсия MSBuild 18.10.1-1.26427.6+3cd27c13e для .NET Framework 1>Checking Build SystemBuilding Custom Rule D:/dev/MyEngine/CMakeLists.txtmain.cppapp.vcxproj -> D:\dev\MyEngine\build\Debug\app.exeBuilding Custom Rule D:/dev/MyEngine/CMakeLists.txtcmake -S . -B build: она прочитала CMakeLists.txt и записала в папку build список дел и другие файлы.Версия MSBuild 18.10.1 — первая строка вывода, и написал её уже не CMake, а сборщик MSBuild, которого CMake только что запустил. Так программа при старте сообщает свою версию. MSBuild входит в Visual Studio, но это отдельная программа, поэтому дальше в консоли идёт её собственный вывод.
Среди файлов из папки build MSBuild находит app.vcxproj — файл, который CMake записал при cmake -S . -B build: она прочитала CMakeLists.txt и записала в папку build список дел и другие файлы.
В конце строки стоит
Checking Build System — «проверка системы сборки». Сначала MSBuild проверяет, не менялся ли CMakeLists.txt после того, как его прочитал CMake. Для этого CMake при cmake -S . -B build: она прочитала CMakeLists.txt и записала в папку build список дел и другие файлы.
Если файл изменился, MSBuild сам запускает CMake, и тот делает то же, что при первой команде: заново читает CMakeLists.txt и перезаписывает файлы в папке build, в том числе app.vcxproj. Сборка идёт уже по новому списку дел, поэтому повторять настройку вручную не нужно.
Сейчас файл не менялся, CMake не запускается, и строки Building Custom Rule … CMakeLists.txt проходят вхолостую. Строк Building Custom Rule две, потому что такая проверка есть в двух проектах из папки build: app. Лишние добавил CMake. app.vcxproj — твоя цель app. ALL_BUILD.vcxproj — «собрать всё»: проект, который запускает сборку всех остальных. ZERO_CHECK.vcxproj — проект, в котором живёт сама проверка CMakeLists.txt. Проверка подключена к app.vcxproj и ALL_BUILD.vcxproj, поэтому строк две.
main.cpp — MSBuild перешёл к первому делу из списка: перевести этот файл в машинный код. Для этого MSBuild запустил
Результат работы компилятора — файл main.obj. Это .cpp. Объектный файл ещё не программа: код в объектном файле записан отдельно от остальных частей, и места, где нужен чужой код, пока остаются пустыми ссылками.main. Запустить main.obj нельзя. В main.cpp ты только вызываешь std::cout#include <iostream>int main(){ std::cout << "Hello, Engine!\n"; return 0;}.obj с библиотеками в один файл .exe: находит в библиотеке, где лежит код, на который ссылается .obj, и записывает это место вместо пустой ссылки.
app.vcxproj -> — последний шаг сборки. MSBuild запустил .obj с библиотеками в один файл .exe.std::cout#include <iostream>int main(){ std::cout << "Hello, Engine!\n"; return 0;}
Стрелка в строке вывода показывает результат: слева проект app.
D:\dev\MyEngine\build\Debug\app.exe — путь к готовой программе. Программа лежит в add_executable. По имени цели CMake называет и проект app.vcxproj, и готовый app.exe.cmake_minimum_required(VERSION 3.28)project(Engine LANGUAGES CXX)add_executable(app main.cpp)