Spec-Zone.ru › CMake 3.23

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

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–2022 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.23/manual/cmake-qt.7.html

Spec-Zone.ru

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