Современный CMake в разработке на Qt
Современная архитектура CMake Qt6
Современная архитектура CMake для Qt 6
Для создания профессиональных приложений на Qt 6 с помощью CMake важно придерживаться современных практик. Это обеспечивает чистоту, масштабируемость и кроссплатформенность вашего проекта. Начнем с основ: минимальные требования и подключение модулей Qt.
Любой современный проект Qt 6 требует CMake версии не ниже 3.16 и компилятор с поддержкой стандарта C++17. Первые строки вашего файла CMakeLists.txt всегда будут задавать эти минимальные требования и определять имя проекта. Затем, чтобы использовать компоненты Qt, мы должны их найти с помощью команды find_package. Эта команда ищет установленный фреймворк Qt 6 и проверяет наличие нужных нам модулей, например, Widgets или Core.
cmake_minimum_required(VERSION 3.16)
project(MyQtApp VERSION 1.0
DESCRIPTION "My First Modern Qt6 App"
LANGUAGES CXX)
# Находим Qt6 и запрашиваем необходимые компоненты
find_package(Qt6 REQUIRED COMPONENTS Widgets)
После того как CMake нашел Qt, в дело вступает ключевая команда qt_standard_project_setup. Эта команда — сердце современной конфигурации. Она автоматически настраивает множество параметров проекта в соответствии с лучшими практиками Qt 6:
- Политики CMake: Устанавливает современные политики, избавляя от необходимости делать это вручную.
- Пути установки: Корректно настраивает пути для развертывания приложения.
- Автоматизация: Включает переменные
AUTOGEN(такие какCMAKE_AUTOMOC,CMAKE_AUTOUIC,CMAKE_AUTORCC), которые автоматически запускают мета-объектный компилятор (MOC), компилятор пользовательского интерфейса (UIC) и компилятор ресурсов (RCC). Это избавляет от ручного вызова этих утилит, что было нормой в старых проектах.
Целеориентированный подход
Современный CMake построен вокруг концепции «целей» (targets). Цель — это, например, ваше приложение или библиотека. Вместо использования глобальных переменных для определения исходных файлов или путей, мы привязываем все свойства непосредственно к цели. Это делает конфигурацию более модульной и понятной.
Для создания цели исполняемого файла Qt 6 предоставляет команду qt_add_executable. Она является оберткой над стандартной командой add_executable, но с дополнительными преимуществами. Например, она автоматически обрабатывает специфичные для Windows настройки, такие как WIN32_EXECUTABLE, избавляя вас от необходимости писать условную логику для разных операционных систем.
# Устанавливает стандартные настройки проекта Qt6
qt_standard_project_setup()
# Создаем цель исполняемого файла
qt_add_executable(my_app
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
После создания цели ей нужно сообщить, с какими библиотеками она должна быть скомпонована. Для этого используется команда target_link_libraries. Здесь проявляется вся мощь целеориентированного подхода. Мы просто указываем нашу цель (my_app) и цели библиотек Qt, которые мы нашли ранее (Qt6::Widgets).
Важно также указать область видимости зависимости: PRIVATE или PUBLIC.
PRIVATE: Ваша цель использует библиотеку, но эта зависимость не передается другим целям, которые могут использовать вашу. Используйте это, если заголовки библиотеки Qt включаются только в ваши.cppфайлы.PUBLIC: Зависимость передается дальше. Используйте это, если вы включаете заголовки библиотеки Qt в публичные заголовочные файлы вашей цели. Для исполняемых файлов разница часто не так важна, но для библиотек это критично.
# Привязываем нашу цель к модулю Qt Widgets
target_link_libraries(my_app PRIVATE Qt6::Widgets)
Собираем все вместе
Теперь давайте посмотрим на полный, но минимальный CMakeLists.txt для простого приложения Qt 6. Он чист, лаконичен и следует всем современным практикам.
# Минимальные требования
cmake_minimum_required(VERSION 3.16)
# Определение проекта
project(MyQtApp LANGUAGES CXX)
# Поиск Qt6 и его компонентов
find_package(Qt6 REQUIRED COMPONENTS Widgets)
# Автоматическая настройка проекта по стандартам Qt6
qt_standard_project_setup()
# Создание цели исполняемого файла с исходниками
qt_add_executable(my_app
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
# Линковка с модулями Qt
target_link_libraries(my_app PRIVATE Qt6::Widgets)
Этот файл содержит все необходимое для сборки вашего приложения на любой платформе, поддерживаемой Qt и CMake. Он автоматически обработает файлы .ui и заголовки с макросами Q_OBJECT, скомпилирует исходные коды и свяжет все вместе в готовый исполняемый файл.
Такая структура закладывает прочный фундамент. По мере роста вашего проекта вы сможете легко добавлять новые исходные файлы, модули Qt или сторонние библиотеки, сохраняя при этом чистоту и предсказуемость процесса сборки.
Проверим, насколько хорошо вы усвоили основы.
Каковы минимальные требования к версии CMake и стандарту C++ для современного проекта на Qt 6?
Какая команда в современном CMake для Qt 6 является ключевой для автоматической настройки политик, путей установки и утилит AUTOGEN (MOC, UIC, RCC)?
Теперь вы знаете, как создать чистый и современный проект Qt 6 с помощью CMake. Это основа, на которой строятся даже самые сложные приложения.
