Spec-Zone.ru › Qt 5.13

Работа с CMake

CMake — это инструмент, который помогает упростить процесс сборки проектов разработки на разных платформах. CMake автоматизирует генерацию систем сборки, таких как Makefiles и файлы проектов Visual Studio.

CMake — это инструмент сторонних разработчиков со своей документацией. Остальная часть этого раздела подробно описывает особенности использования Qt 5 с CMake. Минимальная версия, необходимая для использования Qt5, составляет CMake 3.1.0.

Начало работы

Первое требование при использовании CMake — это использование find_package для поиска библиотек и заголовочных файлов, поставляемых с Qt. Затем эти библиотеки и заголовочные файлы можно использовать для создания библиотек и приложений на основе Qt.

Рекомендуемый способ использования библиотек и заголовочных файлов Qt с CMake — это использование команды target_link_libraries. Эта команда автоматически добавляет соответствующие каталоги включения, определения компиляции, флаг независимого от позиции кода и ссылки на библиотеку qtmain.lib в Windows.

Для построения исполняемого файла GUI helloworld типичное использование:

cmake_minimum_required(VERSION 3.1.0)

project(helloworld)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()

find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_executable(helloworld
    mainwindow.ui
    mainwindow.cpp
    main.cpp
    resources.qrc
)

target_link_libraries(helloworld Qt5::Widgets)

Для успешного выполнения find_package, Qt 5 должен быть найден в каталоге CMAKE_PREFIX_PATH, или же Qt5_DIR должно быть установлено в кэше CMake в местоположение файла Qt5Config.cmake. Самый простой способ использовать CMake — установить переменную среды CMAKE_PREFIX_PATH в префикс установки Qt 5.

Настройка CMAKE_AUTOMOC автоматически запускает moc при необходимости. Дополнительную информацию об этой функции можно найти в документации CMake AUTOMOC

Импортированные цели

Для каждого модуля Qt создаются импортированные цели. Для использования в командах CMake, таких как target_link_libraries, следует предпочитать имена импортированных целей, а не использовать переменную, например, Qt5<Module>_LIBRARIES. Фактический путь к библиотеке можно получить, используя свойство LOCATION:

find_package(Qt5 COMPONENTS Core REQUIRED)

get_target_property(QtCore_location Qt5::Core LOCATION)

Однако, редко требуется полный путь к библиотеке в коде CMake. Большинство API CMake знают об импортированных целях и могут автоматически использовать их вместо полного пути.

Каждый модуль в Qt 5 имеет целевую библиотеку с соглашением об именовании Qt5::<Module>, которое можно использовать для этой цели.

Импортированные цели создаются с конфигурациями, с которыми был сконфигурирован Qt. То есть, если Qt был сконфигурирован с флагом -debug, будет создана импортированная цель с конфигурацией DEBUG. Если Qt был сконфигурирован с флагом -release, будет создана импортированная цель с конфигурацией RELEASE. Если Qt был сконфигурирован с флагом -debug-and-release (по умолчанию в Windows), импортированные цели будут созданы с конфигурациями RELEASE и DEBUG.

Если ваш проект имеет собственные конфигурации сборки CMake, может потребоваться установить отображение вашей пользовательской конфигурации на Qt конфигурации debug или release.

find_package(Qt5 COMPONENTS Core REQUIRED)

set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")

# set up a mapping so that the Release configuration for the Qt imported target is
# used in the COVERAGE CMake configuration.
set_target_properties(Qt5::Core PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE "RELEASE")

Плагины также доступны как цели IMPORTED в CMake. Модули Qt Network, Qt SQL, Qt GUI и Qt Widgets имеют связанные плагины. Они предоставляют список плагинов в переменной Qt5<Module>_PLUGINS.

foreach(plugin ${Qt5Network_PLUGINS})
  get_target_property(_loc ${plugin} LOCATION)
  message("Plugin ${plugin} is at location ${_loc}")
endforeach()

Справочник по переменным

Переменные модулей

Результат вызова find_package — это создание импортированных целей для использования с target_link_libraries, заполнение некоторых переменных информацией, необходимой для конфигурации сборки, и предоставление доступных макросов. Имя импортированной цели для каждого модуля соответствует имени модуля с префиксом 'Qt5::', например Qt5::Widgets. Все переменные, специфичные для пакета, имеют согласованное имя с префиксом имени пакета. Например, find_package(Qt5 COMPONENTS Widgets) при успешном поиске сделает доступными следующие переменные:

  • Qt5Widgets_VERSION Строка, описывающая версию модуля.
  • Qt5Widgets_LIBRARIES Список библиотек для использования с командой target_link_libraries.
  • Qt5Widgets_INCLUDE_DIRS Список каталогов для использования с командой include_directories.
  • Qt5Widgets_DEFINITIONS Список определений для использования с add_definitions.
  • Qt5Widgets_COMPILE_DEFINITIONS Список определений для использования со свойством COMPILE_DEFINITIONS целевой библиотеки.
  • Qt5Widgets_FOUND Булево значение, описывающее, был ли модуль успешно найден.
  • Qt5Widgets_EXECUTABLE_COMPILE_FLAGS Строка флагов, которые нужно использовать при построении исполняемых файлов.

Эквивалентные переменные будут доступны для всех пакетов, найденных с помощью вызова find_package. Обратите внимание, что переменные чувствительны к регистру.

Переменные установки

Кроме того, доступны несколько других переменных, которые не относятся к конкретному пакету, а к самой установке Qt.

  • QT_VISIBILITY_AVAILABLE Булево значение, описывающее, был ли Qt построен с скрытой видимостью.
  • QT_LIBINFIX Строка, содержащая инфикс, используемый в именах библиотек.

Справочник по макросам

Макросы Qt5Core

Макросы, доступные при поиске Qt5Core.

Макрос Описание
qt5_wrap_cpp(outfiles inputfile ... OPTIONS ...) Создает код moc из списка файлов, содержащих классы Qt с объявлением Q_OBJECT. Также добавляются определения препроцессора для каждого каталога. Можно указать опции для moc, такие как те, которые можно найти при выполнении "moc -help".
qt5_add_resources(outfiles inputfile ... OPTIONS ...) Создает код из списка файлов ресурсов Qt. Можно указать опции для rcc, такие как те, которые можно найти при выполнении "rcc -help".
qt5_add_binary_resources(target inputfile ... OPTIONS ... DESTINATION ...) Создает файл RCC из списка файлов ресурсов Qt. Можно указать опции для rcc, такие как те, которые можно найти при выполнении "rcc -help". Можно указать место назначения для использования другого имени файла или пути к файлу RCC.
qt5_generate_moc(inputfile outputfile ) Создаёт правило для запуска moc на входном файле и создания выходного файла. Используйте это, если по какой-то причине QT5_WRAP_CPP() не подходит, например, если вам нужен пользовательский имя файла moc или что-то подобное.
qt5_use_modules(target [LINK_PUBLIC|LINK_PRIVATE] module ... ) Указывает, что целевой объект использует указанные модули Qt 5. Целевой объект будет связан с указанными модулями, будут использованы каталоги заголовков, установленные этими модулями, будут использованы определения COMPILE_DEFINITIONS, установленные этими модулями, и будут использованы COMPILE_FLAGS, установленные модулями. Опционально можно указать LINK_PRIVATE или LINK_PUBLIC. Если LINK_PRIVATE указан, тогда модули не входят в интерфейс линковки целевого объекта. См. документацию для target_link_libraries для получения дополнительной информации.

Обратите внимание, что этот макрос доступен только при использовании CMake 2.8.9 или более поздней версии. Этот макрос устарел. Вместо него используйте target_link_libraries с импортированными целями.

Макросы Qt5Widgets

Макросы, доступные при поиске Qt5Widgets.

Макрос Описание
qt5_wrap_ui(outfiles inputfile ... OPTIONS ...) Создает код из списка файлов ui Qt Designer. Можно указать опции для uic, такие как те, которые можно найти при выполнении "uic -help"

Макросы Qt5DBus

Макросы, доступные при поиске Qt5DBus.

Макрос Описание
qt5_add_dbus_interface(outfiles interface basename) Создает заголовочный файл и файл реализации интерфейса с заданным базовым именем из заданного XML-файла интерфейса и добавляет его в список исходных файлов
qt5_add_dbus_interfaces(outfiles inputfile ... ) Создает заголовочный файл и файл реализации интерфейса для всех перечисленных XML-файлов интерфейса, имя будет автоматически определяться по имени XML-файла
qt5_add_dbus_adaptor(outfiles xmlfile parentheader parentclassname [basename] [classname]) Создает адаптер dbus (заголовочный и реализующий файлы) из XML-файла, описывающего интерфейс, и добавляет его в список исходных файлов. Адаптер перенаправляет вызовы родительскому классу, определенному в parentheader и имеющему имя parentclassname. Имя сгенерированных файлов будет <basename>adaptor.{cpp,h}, где basename по умолчанию совпадает с базовым именем XML-файла. Если <classname> указан, он используется в качестве имени класса адаптера.
qt5_generate_dbus_interface( header [interfacename] OPTIONS ...) Генерирует XML-файл интерфейса из заданного заголовочного файла. Если необязательный аргумент interfacename опущен, имя файла интерфейса создается из базового имени заголовочного файла с добавленным расширением .xml. Можно указать опции для qdbuscpp2xml, например, те, которые можно найти при выполнении "qdbuscpp2xml --help"

Макросы Qt5LinguistTools

Макросы, доступные при поиске Qt5LinguistTools.

Макрос Описание
qt5_create_translation( qm_files directories ... sources ... ts_files ... OPTIONS ...) Выход: qm_files Вход: Директории источники ts_files Параметры: флаги для передачи в lupdate, такие как -extensions для указания расширений для сканирования директорий. Генерирует команды для создания файлов .ts (через lupdate) и .qm (через lrelease) из директорий и/или источников. Файлы ts создаются и/или обновляются в дереве исходного кода (если не указаны полные пути). Файлы qm генерируются в дереве сборки. Обновление переводов можно выполнить, добавив qm_files в список исходных файлов вашей библиотеки/исполняемого файла, чтобы они всегда обновлялись, или добавив пользовательскую цель для управления временем их обновления/генерации.
qt5_add_translation( qm_files ts_files ... ) Выход: qm_files Вход: ts_files Генерирует команды для создания файлов .qm из файлов .ts. Сгенерированные имена файлов можно найти в qm_files. Файлы ts должны существовать и не обновляются.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/cmake-manual.html

Spec-Zone.ru

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