Создание с помощью 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(testproject)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed
set(CMAKE_AUTOMOC ON)
# Create code from a list of Qt designer ui files
set(CMAKE_AUTOUIC ON)
# Find the QtWidgets library
find_package(Qt5 COMPONENTS Widgets REQUIRED)
# Populate a CMake variable with the sources
set(helloworld_SRCS
mainwindow.ui
mainwindow.cpp
main.cpp
)
# Tell CMake to create the helloworld executable
add_executable(helloworld WIN32 ${helloworld_SRCS})
# Use the Widgets module from Qt 5
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 на infile и создания outfile. Используйте это, если по какой-то причине 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. Обратите внимание, что этот макрос доступен только при использовании |
Макросы Qt5Widgets
Макросы, доступные при поиске Qt5Widgets.
| Макрос | Описание |
|---|---|
| qt5_wrap_ui(outfiles inputfile ... OPTIONS ...) | Создает код из списка файлов Qt designer ui. Можно передать опции для 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_files должны существовать и не обновляются. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/cmake-manual.html