Spec-Zone.ru › Qt 6.0

Начало работы с 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.0)

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.0)

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

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:

  1. Установите переменную среды CMAKE_PREFIX_PATH для указания пути к установке Qt 6.
  2. Установите переменную кэша 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).

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.0/cmake-get-started.html

Spec-Zone.ru

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