Spec-Zone.ru › Qt

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

CMake — это группа инструментов, которые позволяют создавать, тестировать и упаковывать приложения. Подобно Qt, он доступен на всех основных платформах разработки. Он также поддерживается различными IDE, включая Qt Creator.

В этом разделе мы покажем самый базовый способ использования Qt в проекте CMake. Мы пройдем по примеру проекта, использующего Qt Widgets.

Создание исполняемого файла C++ GUI

Проект CMake определяется файлами, написанными на языке CMake. Главный файл называется CMakeLists.txt, и обычно размещается в той же директории, что и исходные коды программы.

Вот типичный файл CMakeLists.txt для приложения, написанного на C++ и использующего Qt и Qt Widgets:

cmake_minimum_required(VERSION 3.16)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

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

find_package(Qt6 COMPONENTS Widgets REQUIRED)

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

target_link_libraries(helloworld PRIVATE Qt6::Widgets)

Давайте пройдемся по содержанию.

cmake_minimum_required(VERSION 3.16)

cmake_minimum_required() указывает минимальную версию CMake, необходимую для приложения. Сам Qt требует как минимум версии CMake 3.16. Если вы используете Qt, скомпилированный статически (по умолчанию в Qt для iOS и Qt для WebAssembly), вам потребуется CMake версии 3.21.1 или новее.

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

project() задает имя проекта и версию по умолчанию. Аргумент LANGUAGES сообщает CMake, что программа написана на C++.

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

Qt 6 требует компилятор, поддерживающий версию C++ 17 или новее. Обеспечение этого, установив переменные CMAKE_CXX_STANDARD, CMAKE_CXX_STANDARD_REQUIRED, позволит CMake выводить ошибку, если компилятор слишком старый.

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

Приложения Qt обычно используют мета-объектный компилятор (moc), компилятор ресурсов (rcc) и компилятор пользовательского интерфейса (uic), входящие в состав Qt. Установка переменных CMAKE_AUTOMOC, CMAKE_AUTORCC, и CMAKE_AUTOUIC в значение ON позволит CMake автоматически настроить правила, чтобы соответствующие компиляторы вызывались прозрачно при необходимости.

find_package(Qt6 COMPONENTS Widgets REQUIRED)

Это сообщает CMake найти Qt 6 и импортировать модуль Widgets. Нет смысла продолжать, если CMake не может найти модуль, поэтому мы устанавливаем флаг REQUIRED, чтобы в этом случае CMake прервал выполнение.

При успешном выполнении модуль установит некоторые переменные CMake, описанные в Переменных модуля. Кроме того, он импортирует цель Qt6::Widgets, которую мы используем ниже.

Для успешного выполнения find_package CMake должен найти установку Qt. Существуют различные способы сообщить CMake об Qt, но наиболее распространенный и рекомендуемый подход заключается в установке переменной кэша CMake CMAKE_PREFIX_PATH для включения префикса установки Qt 6. Обратите внимание, что Qt Creator сделает это автоматически для вас.

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

add_executable() сообщает CMake, что мы хотим создать исполняемый файл (а не библиотеку) под названием helloworld в качестве целевого объекта. Целевой объект должен быть построен из кода C++ (mainwindow.cpp, main.cpp ), файла Qt Designer (mainwindow.ui) и файла Системы ресурсов Qt (resources.qrc).

Обратите внимание, что вы обычно не указываете здесь заголовочные файлы. Это отличается от qmake, где заголовочные файлы необходимо явно указать для их обработки мета-объектным компилятором (moc).

Для менее тривиальных проектов вы можете вызвать qt_add_executable() вместо этого. Это оболочка встроенной команды add_executable(), предоставляющая дополнительную логику для автоматической обработки таких вещей, как подключение плагинов Qt в статических сборках Qt, платформенно-специфической настройки имен библиотек и т. д.

target_link_libraries(helloworld PRIVATE Qt6::Widgets)

Наконец, target_link_libraries сообщает CMake, что исполняемый файл helloworld использует Qt Widgets, ссылаясь на целевой объект Qt6::Widgets, импортированный вызовом find_package() выше. Это не только добавит нужные аргументы в компоновщик, но также гарантирует, что правильные каталоги включения, определения компилятора будут переданы компилятору C++. Ключевое слово PRIVATE не строго необходимо для целевого объекта исполняемого файла, но является хорошей практикой. Если бы helloworld была библиотекой, а не исполняемым файлом, то необходимо было бы указать PRIVATE или PUBLIC (PUBLIC, если библиотека упоминает что-либо из Qt6::Widgets в своих заголовках, PRIVATE в противном случае).

Дополнительные материалы

Официальная документация CMake — неоценимый источник для работы с CMake.

Книга Professional CMake: A Practical Guide предоставляет отличное введение в наиболее релевантные функции CMake.

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

Spec-Zone.ru

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