cmake-qt(7)
Введение
CMake может находить и использовать библиотеки Qt 4 и Qt 5. Библиотеки Qt 4 обнаруживаются модулем поиска FindQt4, поставляемым с CMake, а библиотеки Qt 5 — с помощью «пакетов файлов конфигурации», поставляемых с Qt 5. Подробнее о пакетах CMake см. cmake-packages(7), а руководство по 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 будет помещён в файл, имя которого соответствует <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 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.25/manual/cmake-qt.7.html