Spec-Zone.ru › CMake 3.24

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), а руководство по Qt CMake см. на сайте Qt cmake manual для вашей версии 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>/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.

Целевая запись может заполнить свойство целевой записи 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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.24/manual/cmake-qt.7.html

Spec-Zone.ru

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