cmake-qt(7)
- Введение
- Цель
<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 см. cmake-packages(7), а руководство по CMake для Qt см. в руководстве 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 ищется в следующих местах:
<source_dir>/<basename>.ui<source_dir>/<path><basename>.ui<AUTOUIC_SEARCH_PATHS>/<basename>.ui<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 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}
)
Потребляющий проект, связанный с целевым объектом, экспортированным из 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.
Примечание
Если используется 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.30/manual/cmake-qt.7.html