Spec-Zone.ru › CMake 3.31

cmake-qt(7)

  • Введение
  • Инструменты сборки Qt

    • AUTOMOC
    • AUTOUIC
    • AUTORCC
  • Цель <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-packages(7) для получения дополнительной информации о пакетах CMake и справочник Qt по CMake для вашей версии 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 ищется в следующих местах

  1. <source_dir>/<basename>.ui
  2. <source_dir>/<path><basename>.ui
  3. <AUTOUIC_SEARCH_PATHS>/<basename>.ui
  4. <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.

END_OF_DOCUMENT_MARKER

Цель может заполнить свойство цели 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.31/manual/cmake-qt.7.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API