Теоретические сведения по C++ для студентов курса “Программирование на основе классов и шабллонов” кафедры ИУ5 МГТУ им. Н.Э. Баумана.

Содержание

Разработка кроссплатформенных приложений

Разработка программного обеспечения требует множества инструментов: компиляторов, сборщиков, тестовых фреймворков и систем упаковки. Кроссплатформенные проекты усложняют этот процесс, так как не всегда можно использовать интегрированные среды разработки вроде Xcode или Visual Studio.

CMake облегчает работу, объединяя настройку, сборку, тестирование и упаковку в едином инструменте. Он генерирует файлы проекта для выбранной платформы и инструмента сборки, а встроенные CTest и CPack позволяют автоматизировать тестирование и создание пакетов. Все этапы управления сборкой можно выполнять напрямую через CMake.

Перед использованием следует установить актуальную версию CMake — многие платформы поставляют устаревшие версии через менеджеры пакетов.

1. Что такое CMake

CMake — это генератор систем сборки, а не компилятор.

CMakeLists.txt
   ↓ (configure)
CMake
   ↓ (generate)
Makefiles / Ninja / Visual Studio / Xcode
   ↓
Компилятор (gcc / clang / MSVC)

CMake позволяет описать проект один раз и собирать его на разных платформах.

2. In-source и Out-of-source сборка

cmake .
make

bad

cmake -S . -B build
cmake --build build

ok

Преимущества out-of-source:

3. Язык CMake. Синтаксис

command(ARG1 ARG2 ...)

Особенности:

4. Переменные

set(MY_VAR "hello")
message(STATUS "${MY_VAR}")

Проверка:

if(DEFINED MY_VAR)
endif()

5. Списки

set(SOURCES a.cpp b.cpp c.cpp)
add_executable(app ${SOURCES})

6. Targets — основа CMake

Target — это логическая единица сборки (цель):

add_executable(app main.cpp)
add_library(mylib src.cpp)

7. Области видимости

target_include_directories(mylib
    PUBLIC include
    PRIVATE src
)
Ключ Назначение
PRIVATE только цель
PUBLIC цель + потребители
INTERFACE только потребители

8. Стандарт C++

set(CMAKE_CXX_STANDARD 20)

bad

target_compile_features(app PRIVATE cxx_std_20)

ok

9. Библиотеки

add_library(static_lib STATIC src.cpp)
add_library(shared_lib SHARED src.cpp)
add_library(header_only INTERFACE)

10. Линковка

target_link_libraries(app PRIVATE mylib)

CMake автоматически передаёт include-директории, флаги и определения.

11. Структура проекта

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)

12. Внешние зависимости FetchContent

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)

13. Тестирование CTest

enable_testing()
add_executable(test1 test.cpp)
add_test(NAME unit COMMAND test1)

Запуск:

ctest --test-dir build

14. Пользовательские опции

option(ENABLE_WARNINGS "Enable warnings" ON)

if(ENABLE_WARNINGS)
    target_compile_options(app PRIVATE -Wall -Wextra)
endif()

15. install и find_package

install(TARGETS mylib EXPORT MyLibTargets)
install(DIRECTORY include/ DESTINATION include)

16. CMakePresets.json

{
  "version": 3,
  "configurePresets": [
    {
      "name": "debug",
      "generator": "Ninja",
      "binaryDir": "build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    }
  ]
}

17. Минимальный шаблон

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)

Рекомендации по изучению

  1. Всегда думать в терминах targets
  2. Использовать CMake
  3. Читать чужие проекты
  4. Использовать CMakePresets
  5. Не копировать устаревшие примеры