Исходная точка
Структура проекта
Давайте рассмотрим проект, в котором рекомендуется вести разработку лабораторных работ.
Папка проекта выглядит следующим образом:
labs
├── lab1
│ ├── CMakeList.txt
│ ├── README.md
│ └── main.cpp
├── lab2
...
└── lab9
Структура репозитория представлена с помощью Box-drawing character.
Последовательно разберемся с тем, что содержится в папке:
CMakeList.txt
- это мы будем трогать и изучать подробнее далее.README.md
- описание решения в формате Markdown. Если вы не знаете о Markdown, то рекомендуется это исправить.main.cpp
- точка входа в нашу программу.
Давайте теперь разбираться с тем, что содержит сейчас CMakeList.txt
.
Описание CMakeList.txt
Про то, что такое CMake вы узнаете из лекции. Здесь же не вдаваясь в подробности рассмотрим как с ним работать. В CMakeList.txt
содержится следующее:
cmake_minimum_required(VERSION 3.23)
project(lab1)
set(CMAKE_CXX_STANDARD 17)
add_executable(lab1 main.cpp)
IF (NOT WIN32)
target_link_libraries(lab1 m)
ENDIF()
cmake_minimum_required
Команда cmake_minimum_required проверяет запущенную версию CMake: если она меньше указанного минимума, то CMake завершает свою работу фатальной ошибкой.
Это вы оставляете без изменений и не удаляете. В противном случае вы не будете проходить тестирование кода при запросах на слияние.
project
В начале любого CMakeLists.txt следует задать характеристики проекта командой project для лучшего оформления интегрированными средами и прочими инструментами р азработки.
Вызывать эту функцию рекомендуется по умолчанию, так как она позволит инициализировать сборщик и переменные окружения.
Название проекта у вас должно обязательно совпадать с названием директории для лабораторной работы. В противном случае у вас будет ломаться конвейер проверки кода на запросе при слиянии.
set(CMAKE_CXX_STANDARD 17)
Этой функцией вы устанавливаете требование определенного языкового стандарта - C++ 17.
Это требование можно установить различным образом. Но здесь это сделано именно так.
Это вы оставляете без изменений и не удаляете.
add_executable
Команда add_executable компилирует исполняемый файл с заданным именем из списка исходников. Важно отметить, что окончательное имя файла зависит от целевой платформы (например, <ExecutableName>.exe
или просто <ExecutableName>
).
Это вы меняете осторожно.
IF-ENDIF
CMake - очень мощная штука (а под капотом вообще магическая штука). CMake - не компилирует программы! CMake подготавливает среду, чтобы уже другие средства, например, MSBuild, Ninja и Make, уже собрали приложения. Иными словами, CMake не занимается непосредственно сборкой, а лишь генерирует файлы сборки из предварительно написанного файла сценария CMakeLists.txt
и предоставляет простой единый интерфейс управления.
CMake имеет кучу встроенных средств, позволяющих определить то, на какой платформе он работает, и найти запрашиваемые библиотеки для линковки (компановка объектных файлов и библиотек).
И если мы начинаем говорить про кроссплатформенность, то без конструкций условия никуда не деться.
На платформе WIN32
требуется явно требуется скомпоновать математическую библиотеку math.h
и проект, в котором мы хотим использовать ее. Делается это с помощью команды target_link_libraries компонует библиотеку или исполняемый файл с другими предоставляемыми библиотеками. Первым аргументом данная команда принимает название цели, сгенерированной с помощью команд add_executable или add_library, а последующие аргументы представляют собой названия целей библиотек или полные пути к библиотекам.
Этот блок вы изменяете по необходимости.
Резюме
Мы рассмотрели всю магию CMake для сборки простых консольных приложений? Было страшно?
На самом деле всю "страшную" работу CMake прячет от глаз разработчиков:
Ради интереса можете поизучать исходники.
Далее создадим статическую библиотеку в рассматриваемой директории и подключим ее к нашему проекту lab1
.