Работа с 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 для получения дополнительной информации. Обратите внимание, что этот макрос доступен только при использовании |
Макросы 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