cmake-qt(7)
Введение
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.
Инструменты выполняются как часть синтезированной пользовательской целевой задачи, сгенерированной CMake. Зависимости целевой задачи могут быть добавлены к этой пользовательской целевой задаче путём добавления их в свойство целевой задачи AUTOGEN_TARGET_DEPENDS.
AUTOMOC
Свойство целевой задачи AUTOMOC управляет тем, выполняется ли cmake(1) проверка файлов C++ в целевой задаче, чтобы определить, требуются ли для них moc, и создаются ли правила для выполнения moc в нужное время.
Если макрос Q_OBJECT или Q_GADGET найден в файле заголовка, 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 и ниже; см. их документацию для получения подробностей.
- См.
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 может быть заполнена для предварительной установки параметров для всех последующих целевых задач.
Дополнительные имена файлов зависимостей 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 и ниже; см. их документацию для получения подробностей.
- См.
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.
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–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.9/manual/cmake-qt.7.html