cmake-qt(7)
- Введение
- Цель
<ORIGIN>_autogen - Цель
<ORIGIN>_autogen_timestamp_deps - Генераторы Visual Studio
- qtmain.lib в Windows
Введение
CMake может находить и использовать библиотеки Qt 4, Qt 5 и Qt 6. Библиотеки Qt 4 находятся с помощью модуля поиска FindQt4, поставляемого с CMake, а библиотеки Qt 5 и Qt 6 находятся с помощью "пакетов файлов конфигурации", поставляемых с Qt 5 и Qt 6. Дополнительную информацию о пакетах CMake см. в cmake-packages(7), а руководство по CMake для Qt см. в руководстве по CMake Qt для вашей версии Qt.
Qt 4, Qt 5 и Qt 6 могут использоваться вместе в одной и той же системе CMake buildsystem:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR) project(Qt4_5_6) set(CMAKE_AUTOMOC ON) find_package(Qt6 COMPONENTS Widgets DBus REQUIRED) add_executable(publisher publisher.cpp) target_link_libraries(publisher Qt6::Widgets Qt6::DBus) find_package(Qt5 COMPONENTS Gui DBus REQUIRED) add_executable(subscriber1 subscriber1.cpp) target_link_libraries(subscriber1 Qt5::Gui Qt5::DBus) find_package(Qt4 REQUIRED) add_executable(subscriber2 subscriber2.cpp) target_link_libraries(subscriber2 Qt4::QtGui Qt4::QtDBus)
Одна цель CMake не может ссылаться на более чем одну версию Qt. Если это происходит или происходит в результате транзитивного анализа зависимостей целей, выводится диагностическое сообщение.
Инструменты сборки Qt
Qt использует некоторые встроенные инструменты для генерации кода, такие как moc для генерации метаобъектного кода, uic для макетирования и заполнения виджетов и rcc для генерации содержимого виртуальной файловой системы. Эти инструменты могут быть автоматически вызваны cmake(1), если выполнены соответствующие условия. Автоматическое вызов инструментов может использоваться с версиями Qt от 4 до 6.
AUTOMOC
Свойство цели AUTOMOC управляет тем, проверяет ли cmake(1) файлы C++ в целевой задаче, чтобы определить, требуются ли они moc, и создает правила для выполнения moc в нужное время.
Если в файле заголовка найдена макрос из AUTOMOC_MACRO_NAMES, будет запущен moc, а результат помещен в файл с именем, соответствующим moc_<basename>.cpp. Если макрос найден в файле реализации C++, вывод moc помещается в файл с именем, соответствующим <basename>.moc, следуя конвенциям Qt. Файл <basename>.moc должен быть включен пользователем в файл реализации C++ с помощью препроцессора #include.
Включенные moc_*.cpp и *.moc файлы будут сгенерированы в директории <AUTOGEN_BUILD_DIR>/include, которая автоматически добавляется в INCLUDE_DIRECTORIES целевой задачи.
- Это отличается от CMake 3.7 и ниже; см. их документацию для получения подробностей.
- Для
multi configuration generators, каталог включения —<AUTOGEN_BUILD_DIR>/include_<CONFIG> - См.
AUTOGEN_BUILD_DIR.
Не включенные moc_<basename>.cpp файлы будут сгенерированы в пользовательских папках, чтобы избежать конфликтов имен, и включены в отдельный файл, который компилируется в целевую задачу, с именем <AUTOGEN_BUILD_DIR>/mocs_compilation.cpp или <AUTOGEN_BUILD_DIR>/mocs_compilation_$<CONFIG>.cpp.
- См.
AUTOGEN_BUILD_DIR.
Команда moc будет использовать свойства целевой задачи COMPILE_DEFINITIONS и INCLUDE_DIRECTORIES, и для соответствующей конфигурации сборки.
Свойство цели AUTOMOC может быть предварительно установлено для всех последующих целей путём установки переменной CMAKE_AUTOMOC. Свойство цели AUTOMOC_MOC_OPTIONS может быть заполнено для установки опций, передаваемых moc. Переменная CMAKE_AUTOMOC_MOC_OPTIONS может быть заполнена для предварительной установки опций для всех последующих целей.
Дополнительные имена макросов для поиска могут быть добавлены в AUTOMOC_MACRO_NAMES.
Дополнительные имена файлов зависимостей moc могут быть извлечены из исходного кода с помощью AUTOMOC_DEPEND_FILTERS.
Исходные файлы C++ могут быть исключены из обработки AUTOMOC путём включения SKIP_AUTOMOC или более широкого свойства SKIP_AUTOGEN.
AUTOUIC
Свойство цели AUTOUIC управляет тем, проверяет ли cmake(1) файлы C++ в целевой задаче, чтобы определить, требуются ли они uic, и создает правила для выполнения uic в нужное время.
Если найден препроцессор #include директива, соответствующая <path>ui_<basename>.h, и существует файл <basename>.ui, то uic выполняется для генерации соответствующего файла. Файл <basename>.ui ищется в следующих местах:
<source_dir>/<basename>.ui<source_dir>/<path><basename>.ui<AUTOUIC_SEARCH_PATHS>/<basename>.ui<AUTOUIC_SEARCH_PATHS>/<path><basename>.ui
где <source_dir> — директория файла C++, а AUTOUIC_SEARCH_PATHS — список дополнительных путей поиска.
Сгенерированные файлы ui_*.h помещаются в каталог <AUTOGEN_BUILD_DIR>/include, который автоматически добавляется в INCLUDE_DIRECTORIES целевой задачи.
- Это отличается от CMake 3.7 и ниже; см. их документацию для получения подробностей.
- Для
multi configuration generators, каталог включения —<AUTOGEN_BUILD_DIR>/include_<CONFIG> - См.
AUTOGEN_BUILD_DIR.
Свойство цели AUTOUIC может быть предварительно установлено для всех последующих целей путём установки переменной CMAKE_AUTOUIC. Свойство цели AUTOUIC_OPTIONS может быть заполнено для установки опций, передаваемых uic. Переменная CMAKE_AUTOUIC_OPTIONS может быть заполнена для предварительной установки опций для всех последующих целей. Свойство файла исходного кода AUTOUIC_OPTIONS может быть установлено для файла <basename>.ui для установки особых опций для этого файла. Это переопределяет опции из свойства цели AUTOUIC_OPTIONS.
Целевой объект может заполнить свойство целевого объекта INTERFACE_AUTOUIC_OPTIONS параметрами, которые следует использовать при вызове uic. Это должно соответствовать содержимому свойства целевого объекта AUTOUIC_OPTIONS целевого объекта-зависимости. Переменная CMAKE_DEBUG_TARGET_PROPERTIES может использоваться для отслеживания целевого объекта-источника таких INTERFACE_AUTOUIC_OPTIONS. Это означает, что библиотека, предоставляющая альтернативную систему трансляции для Qt, может указать параметры, которые следует использовать при запуске uic.
add_library(KI18n klocalizedstring.cpp)
target_link_libraries(KI18n Qt6::Core)
# KI18n uses the tr2i18n() function instead of tr(). That function is
# declared in the klocalizedstring.h header.
set(autouic_options
-tr tr2i18n
-include klocalizedstring.h
)
set_property(TARGET KI18n APPEND PROPERTY
INTERFACE_AUTOUIC_OPTIONS ${autouic_options}
)
Потребляющий проект, ссылающийся на целевой объект, экспортированный из источника, автоматически использует соответствующие параметры при запуске uic командой AUTOUIC в результате связывания с целевым объектом IMPORTED.
set(CMAKE_AUTOUIC ON) # Uses a libwidget.ui file: add_library(LibWidget libwidget.cpp) target_link_libraries(LibWidget KF5::KI18n Qt5::Widgets )
Файлы исходного кода можно исключить из обработки AUTOUIC , включив свойство SKIP_AUTOUIC или более широкое свойство SKIP_AUTOGEN.
AUTORCC
Свойство целевого объекта AUTORCC управляет тем, создаёт ли cmake(1) правила для выполнения rcc в нужное время для файлов исходного кода, имеющих расширение .qrc.
add_executable(myexe main.cpp resource_file.qrc)
Свойство целевого объекта AUTORCC может быть предварительно установлено для всех последующих целевых объектов путём установки переменной CMAKE_AUTORCC. Свойство целевого объекта AUTORCC_OPTIONS может быть заполнено, чтобы задать параметры для передачи rcc. Переменная CMAKE_AUTORCC_OPTIONS может быть заполнена для предварительной установки параметров для всех последующих целевых объектов. Свойство файла исходного кода AUTORCC_OPTIONS может быть установлено для файла <name>.qrc, чтобы задать определённые параметры для файла. Это переопределяет параметры из свойства целевого объекта AUTORCC_OPTIONS.
Файлы исходного кода можно исключить из обработки AUTORCC , включив свойство SKIP_AUTORCC или более широкое свойство SKIP_AUTOGEN.
Целевой объект <ORIGIN>_autogen
Инструменты moc и uic выполняются в рамках синтезированного целевого объекта Целевого объекта <ORIGIN>_autogen custom target, сгенерированного CMake. По умолчанию, целевой объект Целевого объекта <ORIGIN>_autogen наследует зависимости целевого объекта <ORIGIN> (см. AUTOGEN_ORIGIN_DEPENDS). Зависимости целевого объекта могут быть добавлены в целевой объект Целевого объекта <ORIGIN>_autogen путём добавления их в свойство целевого объекта AUTOGEN_TARGET_DEPENDS.
Примечание
Если используется Qt 5.15 или более поздняя версия, и генератор — это либо Ninja, либо Генераторы Makefile, см. Целевой объект <ORIGIN>_autogen_timestamp_deps.
Целевой объект <ORIGIN>_autogen_timestamp_deps
Если используется Qt 5.15 или более поздняя версия, и генератор — это либо Ninja, либо Генераторы Makefile, дополнительно создаётся целевой объект <ORIGIN>_autogen_timestamp_deps, помимо целевого объекта Целевого объекта <ORIGIN>_autogen. Этот целевой объект не имеет исходных файлов или команд для выполнения, но он имеет зависимости, которые ранее унаследовались целевым объектом Целевого объекта <ORIGIN>_autogen до Qt 5.15. Эти зависимости будут служить списком зависимостей только для порядка, без принудительного повторного выполнения пользовательской команды.
Генераторы Visual Studio
При использовании Visual Studio generators, CMake генерирует PRE_BUILD custom command вместо Целевого объекта <ORIGIN>_autogen custom target (для AUTOMOC и AUTOUIC). Однако это не всегда возможно, и используется Целевой объект <ORIGIN>_autogen custom target, когда
- целевой объект
<ORIGIN>зависит от файловGENERATED, которые не исключены изAUTOMOCиAUTOUICс помощьюSKIP_AUTOMOC,SKIP_AUTOUIC,SKIP_AUTOGENилиCMP0071 AUTOGEN_TARGET_DEPENDSсодержит файл исходного кодаCMAKE_GLOBAL_AUTOGEN_TARGETвключён
qtmain.lib в Windows
Целевые объекты Qt 4 и 5 IMPORTED для библиотек QtGui указывают, что статическая библиотека qtmain.lib, поставляемая с Qt, будет подключена ко всем зависимым исполняемым файлам, у которых включено свойство WIN32_EXECUTABLE.
Чтобы отключить это поведение, включите свойство целевого объекта Qt5_NO_LINK_QTMAIN для целевых объектов Qt 5 или свойство целевого объекта QT4_NO_LINK_QTMAIN для целевых объектов Qt 4.
add_executable(myexe WIN32 main.cpp) target_link_libraries(myexe Qt4::QtGui) add_executable(myexe_no_qtmain WIN32 main_no_qtmain.cpp) set_property(TARGET main_no_qtmain PROPERTY QT4_NO_LINK_QTMAIN ON) target_link_libraries(main_no_qtmain Qt4::QtGui)
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/manual/cmake-qt.7.html