QtMiddleCoding
Что такое интеграция Qt CMake и как она улучшилась в Qt 6?
Qt 6 перевёл всю сборочную систему на CMake и ввёл современные таргеты вида Qt6::Core вместо переменных, автоматический мок (AUTOMOC) и команды qt_add_executable / qt_add_qml_module.
Qt и CMake: история и современное состояние
До Qt 6 основным инструментом сборки был qmake. CMake поддерживался, но через find_package(Qt5) с переменными Qt5_LIBRARIES, без современных IMPORTED-таргетов. Qt 6 полностью перевёл внутреннюю сборку на CMake и переработал публичный API для сторонних проектов.
Ключевые изменения в Qt 6
- IMPORTED-таргеты:
Qt6::Core,Qt6::Widgets,Qt6::Quick— вместо переменныхQT_LIBRARIES. Транзитивные зависимости передаются автоматически. - qt_add_executable: замена
add_executable, которая правильно настраивает WIN32/MACOSX_BUNDLE и регистрирует деплой-цели. - qt_add_qml_module: единственная команда для регистрации QML-модуля: компилирует QML в C++ (qmlcachegen), генерирует
qmldir, регистрирует типы черезQML_ELEMENT. - AUTOMOC по умолчанию: больше не нужно вручную вызывать
qt5_wrap_cpp; достаточноset(CMAKE_AUTOMOC ON)или флагаAUTOMOCвqt_add_executable. - qt_add_resources: ресурсы компилируются в C++ и линкуются статически; поддерживает
BIG_RESOURCESдля обхода ограничения 2 ГБ объектного файла.
Минимальный CMakeLists.txt для Qt 6
cmake_minimum_required(VERSION 3.16)
project(MyApp VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
qt_standard_project_setup() # Включает AUTOMOC, AUTOUIC, AUTORCC
qt_add_executable(myapp
main.cpp
mainwindow.cpp
mainwindow.h
)
target_link_libraries(myapp PRIVATE
Qt6::Core
Qt6::Widgets
)
Проект с QML-модулем
find_package(Qt6 REQUIRED COMPONENTS Core Quick)
qt_standard_project_setup(REQUIRES 6.5)
qt_add_executable(myqmlapp main.cpp)
qt_add_qml_module(myqmlapp
URI com.example.MyApp
VERSION 1.0
QML_FILES
Main.qml
components/Button.qml
SOURCES
backend.cpp backend.h
)
target_link_libraries(myqmlapp PRIVATE Qt6::Quick)
Команда qt_add_qml_module автоматически вызывает qmltyperegistrar и qmlcachegen, создаёт таргет myqmlapp_qmltyperegistrations и экспортирует qmldir.
qt_standard_project_setup
Добавлена в Qt 6.3. Устанавливает разумные defaults:
CMAKE_AUTOMOC ONCMAKE_AUTOUIC ONCMAKE_AUTORCC ON- Политику расположения бинарников по платформенным соглашениям
Конфигурация через пресеты (CMakePresets.json)
{
"version": 6,
"configurePresets": [
{
"name": "qt-release",
"generator": "Ninja",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_PREFIX_PATH": "/opt/Qt/6.7.0/gcc_64"
}
}
]
}
cmake --preset qt-release
cmake --build --preset qt-release
Подводные камни
- Qt5 vs Qt6 пространства имён: нельзя смешивать
find_package(Qt5)иfind_package(Qt6)в одном дереве; используйтеfind_package(QT NAMES Qt6 Qt5 ...)для поддержки обоих. - CMAKE_PREFIX_PATH: если Qt установлен не в системный путь, переменная обязательна; без неё
find_packageмолча завершается ошибкой «not found». - AUTOMOC и forward declarations: MOC не обрабатывает заголовки, не включённые в цель; добавьте их через
target_sourcesилиset_target_properties(... AUTOMOC_DEPEND_FILTERS ...). - qt_add_qml_module URI: URI должен совпадать с тем, что используется в
import-выражении QML; расхождение даёт молчащую ошибку «module not found» в runtime. - Версия CMake:
qt_add_qml_moduleтребует CMake ≥ 3.19;qt_standard_project_setup— ≥ 3.16. Старые CI-образы ломаются. - BIG_RESOURCES: большие ресурсные файлы без этого флага генерируют объектный файл > 2 ГБ, что роняет компилятор на Windows.
- Отладка MOC: при ошибках «undefined reference to vtable» включите
CMAKE_AUTOMOC_VERBOSE=ON— MOC-команда будет выведена явно.
Common mistakes
- Объяснять Qt CMake integration только по синтаксису, без жизненного цикла и стоимости.
- Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
- Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
- Смешивать signals/slots с generic callbacks и забывать про thread affinity.
What the interviewer is testing
- Кандидат формулирует точную модель для Qt CMake integration, а не только определение.
- Пример компилируем, безопасен по lifetime и соответствует версии технологии.
- Названы trade-off, ограничения и диагностируемые симптомы ошибки.
- Понимает границу между C++ кодом, runtime/framework metadata и editor/UI слоем.