Начало работы с 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:
- Установите переменную окружения
CMAKE_PREFIX_PATHдля включения префикса установки Qt 6. - Установите переменную кэша 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