Spec-Zone.ru › CMake 3.15

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-packages(7) для получения дополнительной информации о пакетах CMake и см. руководство по 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 будет помещён в файл, имя которого определено по соглашениям Qt, согласно <basename>.moc. Пользователь должен включить <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}
)

Проект, использующий целевую зависимость, экспортированную из верхнего уровня, автоматически использует соответствующие параметры при запуске 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.15/manual/cmake-qt.7.html

Spec-Zone.ru

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