Справочник CMake
CMake — это инструмент, который помогает упростить процесс сборки проектов разработки на различных платформах. CMake автоматизирует генерацию систем сборки, таких как Makefiles и файлы проектов Visual Studio.
CMake — это инструмент сторонних разработчиков со своей собственной документацией. Остальная часть данного руководства подробно описывает особенности использования Qt 5 с CMake. Минимальная необходимая версия для использования Qt5 — CMake 2.8.3, но рекомендуется версия 3.1.0.
Начало работы
Первое требование при использовании CMake — это использование find_package для поиска библиотек и заголовочных файлов, поставляемых с Qt. Эти библиотеки и заголовочные файлы могут затем использоваться для построения библиотек и приложений на основе Qt.
Рекомендуемый способ использования библиотек и заголовочных файлов Qt с CMake 2.8.11 — использование команды target_link_libraries. В CMake 2.8.11 и более поздних версиях эта команда автоматически добавляет соответствующие каталоги включения, определения компиляции, флаг независимого от позиции кода и ссылки на библиотеку qtmain.lib в Windows.
Для построения исполняемого файла графического интерфейса helloworld типичное использование выглядит так:
cmake_minimum_required(VERSION 2.8.11) 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) # Find the QtWidgets library find_package(Qt5Widgets) # Tell CMake to create the helloworld executable add_executable(helloworld WIN32 main.cpp) # Use the Widgets module from Qt 5. target_link_libraries(helloworld Qt5::Widgets)
Обратите внимание, что установка минимальной необходимой версии CMake в 2.8.11 требуется для автоматической связи с библиотекой qtmain.lib в Windows.
Для успешного использования 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. Большинство CMake API знают об импортированных целях и могут автоматически использовать их вместо полного пути.
Каждый модуль в 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() Использование Qt 5 с CMake младше 3.1.0
Qt 5.7 требует поддержки C++11. CMake начиная с версии 3.1.0 неявно добавляет необходимые минимальные флаги компилятора (например, -std=gnu++11) к целевым модулям Qt5. Если вы используете CMake версию старше 3.1.0, вам необходимо самостоятельно добавить необходимые -std=... к целям, связанным с модулями Qt5.
Если вы используете Qt 5.7 и CMake версию выше 3.1.0, и вам нужна более новая версия стандарта C++, используйте способ CMake для выбора версии стандарта или укажите необходимые функции и позвольте CMake вычислить флаги. Пример:
set(CMAKE_CXX_STANDARD 14)
Также см.: Документация CMake cmake-compile-features
Использование Qt 5 с CMake младше 2.8.12
Также необходимо, при использовании более старой версии CMake, добавить Qt5<Модуль>_EXECUTABLE_COMPILE_FLAGS в CMAKE_CXX_FLAGS, чтобы флаги -fPIC добавлялись к флагам компиляции, если необходимо (как это делается по умолчанию с Qt 5).
Использование Qt 5 с CMake младше 2.8.11
Рекомендуемый способ использования библиотек и заголовочных файлов Qt с CMake до версии 2.8.11 — использование макроса qt5_use_modules.
Обратите внимание, что перед использованием макроса необходимо найти модуль Qt с помощью find_package. Полный список опций для команды CMake find_package представлен в документации.
Макрос qt5_use_modules объединяет все переменные, необходимые для использования модуля Qt. Он автоматически находит модули, указанные в командной строке, если они еще не найдены.
find_package(Qt5Widgets) add_executable(helloworld WIN32 main.cpp) qt5_use_modules(helloworld Widgets)
Использование Qt 5 с CMake младше 2.8.9
Если используется CMake младше 2.8.9, макрос qt5_use_modules недоступен. Попытка его использовать приведет к ошибке.
Для использования Qt 5 с версиями CMake младше 2.8.9 необходимо использовать команды target_link_libraries, include_directories, и add_definitions, а также вручную указывать требования к moc с помощью qt5_generate_moc или qt5_wrap_cpp:
cmake_minimum_required(VERSION 2.8.3)
project(testproject)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Find the QtWidgets library
find_package(Qt5Widgets)
# Add the include directories for the Qt 5 Widgets module to
# the compile lines.
include_directories(${Qt5Widgets_INCLUDE_DIRS})
# Use the compile definitions defined in the Qt 5 Widgets module
add_definitions(${Qt5Widgets_DEFINITIONS})
# Add compiler flags for building executables (-fPIE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
qt5_generate_moc(main.cpp main.moc)
# Tell CMake to create the helloworld executable
add_executable(helloworld main.cpp main.moc)
#Link the helloworld executable to the Qt 5 widgets library.
target_link_libraries(helloworld Qt5::Widgets) Справочник по переменным
Переменные модулей
Результат вызова find_package — это создание импортированных целей для использования с target_link_libraries, заполнение некоторых переменных информацией, необходимой для настройки сборки, и предоставление доступных макросов. Имя импортированной цели для каждого модуля соответствует имени модуля с префиксом 'Qt5::', например Qt5::Widgets. Все переменные, специфичные для пакета, имеют согласованное имя с префиксом имени пакета. Например, вызов find_package(Qt5Widgets) сделает доступными следующие переменные, если модуль успешно найден:
- Qt5Widgets_VERSION Строка, описывающая версию модуля.
- Qt5Widgets_VERSION_STRING То же, что и Qt5Widgets_VERSION. Устаревшее, используйте 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 ...) | Создаёт код из списка файлов 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.9/cmake-manual.html