Компиляция, линковка и основы CMake
Этапы сборки
Упрощённо процесс состоит из предварительной обработки директив, компиляции каждой единицы трансляции, сборки объектных файлов и линковки в исполняемый файл или библиотеку.
- Ошибка компиляции — проблема синтаксиса, типов или правил языка.
- Ошибка линковки — не найдено определение или возник конфликт символов.
- Ошибка времени выполнения — программа собрана, но работает неправильно или завершается аварийно.
Пример CMakeLists.txt
cmake_minimum_required(VERSION 3.20)project(MyApp LANGUAGES CXX)set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_CXX_EXTENSIONS OFF)add_executable(MyApp src/main.cpp src/Math.cpp)target_include_directories(MyApp PRIVATE include)add_executable перечисляет исходники исполняемой цели. target_include_directories задаёт пути поиска заголовков для этой цели.
Подключение библиотек
Для собственного модуля можно создать библиотечную цель через add_library, а затем связать её с приложением:
add_library(mathlib src/Math.cpp)target_include_directories(mathlib PUBLIC include)target_link_libraries(MyApp PRIVATE mathlib)PUBLIC означает, что зависимость нужна самой цели и передаётся её потребителям; PRIVATE — только самой цели; INTERFACE — только потребителям.
Сборка
cmake -S . -B buildcmake --build buildЭти команды конфигурируют проект в папке build и запускают сборку выбранным генератором.
Отладочная и релизная сборка
Отладочная сборка обычно включает символы отладки и меньше оптимизирует код; релизная чаще использует оптимизации. В многоконфигурационных генераторах конфигурацию выбирают при сборке, например --config Release.
Итог
Понимай разницу между компиляцией и линковкой, а настройки сборки описывай в CMake. Настройки лучше привязывать к конкретным целям, а не разбрасывать глобальные флаги по проекту.
