Spec-Zone.ru › Qt 6.1

Начало работы с 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-приложения обычно используют Meta-Object Compiler (moc), Resource Compiler (rcc) и User Interface Compiler (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 Resource System (resources.qrc).

Обратите внимание, что вы обычно не перечисляете заголовочные файлы здесь. Это отличается от qmake, где заголовочные файлы нужно явно указывать, чтобы они обрабатывались Meta-Object Compiler (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.1/cmake-get-started.html

Spec-Zone.ru

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