Теоретические сведения по C++ для студентов курса “Программирование на основе классов и шабллонов” кафедры ИУ5 МГТУ им. Н.Э. Баумана.
Разработка программного обеспечения требует множества инструментов: компиляторов, сборщиков, тестовых фреймворков и систем упаковки. Кроссплатформенные проекты усложняют этот процесс, так как не всегда можно использовать интегрированные среды разработки вроде Xcode или Visual Studio.
CMake облегчает работу, объединяя настройку, сборку, тестирование и упаковку в едином инструменте. Он генерирует файлы проекта для выбранной платформы и инструмента сборки, а встроенные CTest и CPack позволяют автоматизировать тестирование и создание пакетов. Все этапы управления сборкой можно выполнять напрямую через CMake.
Перед использованием следует установить актуальную версию CMake — многие платформы поставляют устаревшие версии через менеджеры пакетов.
CMake — это генератор систем сборки, а не компилятор.
CMakeLists.txt
↓ (configure)
CMake
↓ (generate)
Makefiles / Ninja / Visual Studio / Xcode
↓
Компилятор (gcc / clang / MSVC)
CMake позволяет описать проект один раз и собирать его на разных платформах.
cmake .
make
bad
cmake -S . -B build
cmake --build build
ok
Преимущества out-of-source:
command(ARG1 ARG2 ...)
Особенности:
set(MY_VAR "hello")
message(STATUS "${MY_VAR}")
Проверка:
if(DEFINED MY_VAR)
endif()
set(SOURCES a.cpp b.cpp c.cpp)
add_executable(app ${SOURCES})
Target — это логическая единица сборки (цель):
add_executable(app main.cpp)
add_library(mylib src.cpp)
target_include_directories(mylib
PUBLIC include
PRIVATE src
)
| Ключ | Назначение |
|---|---|
| PRIVATE | только цель |
| PUBLIC | цель + потребители |
| INTERFACE | только потребители |
set(CMAKE_CXX_STANDARD 20)
bad
target_compile_features(app PRIVATE cxx_std_20)
ok
add_library(static_lib STATIC src.cpp)
add_library(shared_lib SHARED src.cpp)
add_library(header_only INTERFACE)
target_link_libraries(app PRIVATE mylib)
CMake автоматически передаёт include-директории, флаги и определения.
project/
├── CMakeLists.txt
├── src/
│ ├── CMakeLists.txt
│ └── main.cpp
├── include/
├── tests/
│ └── CMakeLists.txt
Корневой CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(MyProject LANGUAGES CXX)
add_subdirectory(src)
add_subdirectory(tests)
include(FetchContent)
FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 10.2.1
)
FetchContent_MakeAvailable(fmt)
Использование:
target_link_libraries(app PRIVATE fmt::fmt)
enable_testing()
add_executable(test1 test.cpp)
add_test(NAME unit COMMAND test1)
Запуск:
ctest --test-dir build
option(ENABLE_WARNINGS "Enable warnings" ON)
if(ENABLE_WARNINGS)
target_compile_options(app PRIVATE -Wall -Wextra)
endif()
install(TARGETS mylib EXPORT MyLibTargets)
install(DIRECTORY include/ DESTINATION include)
{
"version": 3,
"configurePresets": [
{
"name": "debug",
"generator": "Ninja",
"binaryDir": "build/debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
}
]
}
cmake_minimum_required(VERSION 3.20)
project(App LANGUAGES CXX)
add_executable(app src/main.cpp)
target_compile_features(app PRIVATE cxx_std_23)
target_compile_options(app PRIVATE -Wall -Wextra)
Рекомендации по изучению