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