Spec-Zone.ru › CMake 3.16

cmake-qt(7)

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

    • AUTOMOC
    • AUTOUIC
    • AUTORCC
  • Цель <ORIGIN>_autogen
  • Генераторы Visual Studio
  • qtmain.lib в Windows

Введение

CMake может находить и использовать библиотеки Qt 4 и Qt 5. Библиотеки Qt 4 находятся с помощью модуля поиска FindQt4, поставляемого с CMake, в то время как библиотеки Qt 5 находятся с помощью «пакетов файлов конфигурации», поставляемых с Qt 5. Дополнительную информацию о пакетах CMake см. в cmake-packages(7), а руководство по CMake для Qt см. в руководстве по CMake Qt для вашей версии Qt.

Qt 4 и Qt 5 можно использовать вместе в одной и той же CMake buildsystem:

cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)

project(Qt4And5)

set(CMAKE_AUTOMOC ON)

find_package(Qt5 COMPONENTS Widgets DBus REQUIRED)
add_executable(publisher publisher.cpp)
target_link_libraries(publisher Qt5::Widgets Qt5::DBus)

find_package(Qt4 REQUIRED)
add_executable(subscriber subscriber.cpp)
target_link_libraries(subscriber Qt4::QtGui Qt4::QtDBus)

Цель CMake не может ссылаться на обе библиотеки Qt 4 и Qt 5. Если это пытаются сделать или это получается из транзитивной зависимости цели, выдается диагностика.

Инструменты сборки Qt

Qt полагается на некоторые встроенные инструменты для генерации кода, такие как moc для генерации метаобъектного кода, uic для макета виджетов и заполнения, и rcc для генерации содержимого виртуальной файловой системы. Эти инструменты могут быть автоматически вызваны cmake(1), если соблюдены соответствующие условия. Автоматическое вызов инструментов можно использовать как с Qt 4, так и с Qt 5.

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.

Команда 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 Qt5::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}
)

Потребляющий проект, который ссылается на экспортированную из upstream цель, автоматически использует соответствующие параметры при 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.

Генераторы 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–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/manual/cmake-qt.7.html

Spec-Zone.ru

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