Справочник 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(Qt5Widgets CONFIG 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 должна быть установлена в расположение файла Qt5WidgetsConfig.cmake. Самый простой способ использовать CMake — установить переменную среды CMAKE_PREFIX_PATH на префикс установки Qt 5.
Настройка CMAKE_AUTOMOC автоматически запускает moc при необходимости. Более подробную информацию об этой функции см. в документации CMake AUTOMOC
Импортированные цели
Для каждого модуля Qt создаются импортированные цели. В командах CMake, таких как target_link_libraries, следует отдавать предпочтение именам импортированных целей вместо использования переменной, например, Qt5<Модуль>_LIBRARIES. Фактический путь к библиотеке можно получить, используя свойство LOCATION:
find_package(Qt5Core) get_target_property(QtCore_location Qt5::Core LOCATION)
Однако, в коде CMake редко требуется полный путь к библиотеке. Большинство API CMake знают об импортированных целях и могут автоматически использовать их вместо полного пути.
Каждый модуль в Qt 5 имеет целевую библиотеку с именем Qt5::<Модуль>, которое можно использовать для этой цели.
Импортированные цели создаются с теми конфигурациями, с которыми был настроен Qt. То есть, если Qt был настроен с переключателем -debug, будет создана импортированная цель с конфигурацией DEBUG. Если Qt был настроен с переключателем -release, будет создана импортированная цель с конфигурацией RELEASE. Если Qt был настроен с переключателем -debug-and-release (по умолчанию в Windows), тогда импортированные цели будут созданы с конфигурациями RELEASE и DEBUG.
Если в вашем проекте есть пользовательские конфигурации сборки CMake, может потребоваться установить отображение от вашей пользовательской конфигурации к конфигурации Qt debug или release.
find_package(Qt5Core)
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<Модуль>_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(Qt5Widgets) при успешном поиске сделает доступными следующие переменные:
- Qt5Widgets_VERSION Строковое описание версии модуля.
- Qt5Widgets_LIBRARIES Список библиотек для использования с командой target_link_libraries.
- Qt5Widgets_INCLUDE_DIRS Список каталогов для использования с командой include_directories.
- Qt5Widgets_DEFINITIONS Список определений для использования с add_definitions.
- Qt5Widgets_COMPILE_DEFINITIONS Список определений для использования со свойством target 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 ...) | Создает код из списка файлов 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/archives/qt-5.11/cmake-manual.html