Мастерство CMake в экосистеме Qt 6
Современная инфраструктура Qt 6
Модернизация вашего проекта Qt
С выходом Qt 6 подход к использованию CMake кардинально изменился. Ушли в прошлое громоздкие скрипты и ручная настройка переменных. Современный CMake для Qt 6 делает ставку на автоматизацию, ясность и переносимость. Вместо того чтобы вручную указывать пути и управлять инструментами вроде moc или uic, мы теперь полагаемся на встроенные механизмы, которые делают код сборки чище и надежнее.
Автоматическая настройка
Ключевая команда, с которой начинается современный проект на Qt 6, — это qt_standard_project_setup. Она выполняет несколько важных задач:
- Настраивает политики CMake: Устанавливает современные политики, обеспечивая предсказуемое поведение системы сборки.
- Задает пути установки: Автоматически конфигурирует стандартные пути установки с помощью модуля
GNUInstallDirs. Это гарантирует, что ваше приложение будет установлено в правильные каталоги (/usr/local/bin,/usr/local/libи т.д.) в Unix-подобных системах. - Включает
AUTOUIC,AUTOMOCиAUTORCC: Эти переменные больше не нужно выставлять вручную. Команда активирует их по умолчанию, и CMake автоматически запускает компилятор метаобъектной информации (moc), компилятор интерфейсов (uic) и компилятор ресурсов (rcc), когда это необходимо.
# Указываем минимальную версию CMake и объявляем проект
cmake_minimum_required(VERSION 3.16)
project(MyQt6App VERSION 1.0 LANGUAGES CXX)
# Включаем стандартную настройку для проектов Qt
qt_standard_project_setup()
Это все, что нужно для базовой инициализации. Больше никаких set(CMAKE_AUTOMOC ON). Теперь разберемся, как подключать сами модули Qt.
Поиск и подключение компонентов
Для поиска установленных компонентов Qt используется команда find_package. Она не просто находит библиотеки, но и создает специальные «цели» (targets), которые содержат всю необходимую информацию для компиляции и линковки: пути к заголовочным файлам, флаги компилятора и зависимости.
# Находим Qt 6 и запрашиваем необходимые компоненты
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
После того как компоненты найдены, их нужно прилинковать к вашей цели (например, к исполняемому файлу). Для этого используется команда target_link_libraries. Важно использовать импортированные цели с пространством имен Qt6::, например, Qt6::Core или Qt6::Widgets. Это современный и правильный способ.
Использование целей
Qt6::TargetNameвместо старых переменных (вродеQt5_Core_LIBRARIES) — это ключевое отличие. Цели автоматически управляют зависимостями, путями и определениями, что избавляет вас от ручной работы и делает скрипт сборки чище.
При линковке также важно указывать область видимости: PRIVATE или PUBLIC.
PRIVATE: Зависимость нужна только для сборки самой цели (my_app). Она не будет «наследоваться» другими проектами, которые могут использоватьmy_appкак библиотеку.PUBLIC: Зависимость является частью публичного интерфейса цели. Любой другой проект, который будет линковаться сmy_app, также получит эту зависимость (включая заголовочные файлы и определения).
Для исполняемых файлов почти всегда достаточно PRIVATE.
# Указываем стандарт C++ (Qt 6 требует C++17 или новее)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Создаем исполняемый файл из исходников
add_executable(my_app main.cpp MainWindow.h MainWindow.cpp MainWindow.ui)
# Линкуем компоненты Qt с нашим приложением
target_link_libraries(my_app PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
Обратите внимание: MainWindow.ui был добавлен в add_executable. Благодаря автоматической настройке, CMake поймет, что этот файл нужно обработать с помощью uic, и сгенерирует соответствующий заголовочный файл. То же самое произойдет с Q_OBJECT в заголовочных файлах благодаря AUTOMOC.
Какая команда является ключевой для инициализации современного проекта на Qt 6 с использованием CMake и автоматизирует настройку политик, путей установки и инструментов, таких как moc и uic?
Верно ли, что в современном CMake-проекте для Qt 6 необходимо вручную устанавливать переменные CMAKE_AUTOMOC, CMAKE_AUTOUIC и CMAKE_AUTORCC в ON?
Этот современный подход делает проекты на Qt 6 с использованием CMake более структурированными и легкими в поддержке.