mafulechka
mafulechka23 апреля 2020 г. 14:56

Безверсионные цели CMake (Qt 5.15)

Разработчики Qt работают над тем, чтобы портировать Qt 6 на CMake в качестве внутренней системы сборки. Хотя до Qt 6 еще несколько месяцев, вы уже можете увидеть некоторые преимущества этой работы в Qt 5.15. Кристиан Адам (Cristian Adam) уже писал в блоге об улучшениях в CMake 3.17 и о том, как, например, улучшился AUTOMOC в QT 5.15. Эта статья о том, как вы можете подготовиться к Qt 6 в своих проектах CMake.


Оглядываясь назад: с Qt 4 по Qt 5

Хотя Qt 4 - Qt 5 были в значительной степени совместимы с исходным кодом с точки зрения C++, к сожалению, это не относится к самой интеграции CMake. Иногда вам приходилось адаптировать большую часть кода CMake, в случае интеграции Qt.

В настоящее время CMake гораздо чаще используется в проектах Qt, а сама поддержка CMake значительно повзрослела. Следовательно, разработчики не планируют вносить какие-либо радикальные изменения в интеграцию, а вместо этого стараются сделать переход, как можно более плавным.

Проблема: версионные цели и команды

Одна очевидная проблема заключается в том, что в основном все CMake API (цели, переменные, команды), которые предоставляет Qt, содержат в названии основную версию Qt. Это верно даже для очень простых примеров:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
qt5_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt5::Widgets)

Теперь вы можете утверждать, что, при условии, что фактическая семантика не изменяется, замена всех вызовов Qt5::, qt5_ в вашем файле CMake на Qt6::, qt6_ достаточно проста. Однако это не поможет вам, если вы хотите какое-то время поддерживать Qt 5 и Qt 6.

Безверсионные цели и команды

Итак, позвольте вам представить новые безверсионные цели и команды в Qt 5.15. Приведенный выше пример можно записать так:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 5.15 COMPONENTS Widgets LinguistTools REQUIRED)
qt_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt::Widgets)

За исключением вызова find_package это должно работать и для Qt 6.

Если вас интересует дополнительный аргумент 5.15 для find_package: это позволяет CMake вывести ошибку с соответствующим сообщением об ошибке, если ваша версия Qt старше Qt 5.15.

Вы можете отказаться от этих новых целей и команд, установив переменные QT_NO_CREATE_VERSIONLESS_TARGETS или QT_NO_CREATE_VERSIONLESS_FUNCTIONS перед find_package. Это полезно, например, если вы уже определили их сами или, если вы все ещё хотите получить доступ к qt_wrap_cpp в Qt 3.

Смешивание Qt 5 и Qt 6

Позвольте начать с большой оговорки: Qt не поддерживает смешивание разных версий Qt в одном приложении! В любом случае, существуют расширенные варианты использования, в которых вы можете создать отдельные артефакты, используя Qt 5 и Qt 6 в одном проекте.

Для этих случаев вы можете задать для новой переменной QT_DEFAULT_MAJOR_VERSION значение 5 или 6. Если эта переменная установлена перед вызовом find_package, загружающим Qt 5 или Qt 6, безверсионные функции будут использовать логику из соответствующей версии Qt.

Перспективы на будущее

С приближением первого выпуска Qt 5.15 разработчики будут все более и более консервативно касаться существующей инфраструктуры CMake в этой версии. В любом случае, планируется еще улучшить документацию о том, продуктивнее использовать CMake с Qt.

В Qt 6 увидим гораздо больше API, чтобы не только использовать модули Qt, но также и то, как определять ваши собственные модули Qt и плагины.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
S

C++ - Тест 001. Первая программа и типы данных

  • Результат:53баллов,
  • Очки рейтинга-4
S

C++ - Тест 003. Условия и циклы

  • Результат:57баллов,
  • Очки рейтинга-2
g

C++ - Тест 005. Структуры и Классы

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
Evgenii Legotckoi
Evgenii Legotckoi25 мая 2023 г. 10:49
Как написать игру на Qt - Урок 2. Анимация героя игры (2D) Код на строчка 184-198 вызывает перерисовку области на каждый 4-й такт счётчика. По той логике не нужно перерисовывать объект постоянно, достаточно реже, чем выполняется игровой слот. А слот вып…
J
JonnyJo21 мая 2023 г. 16:49
Как написать игру на Qt - Урок 2. Анимация героя игры (2D) Евгений, благодарю! Всё равно не совсем понимаю :( Если муха двигает ножками только при нажатии клавиш перемещение, то что, собственно, делает код со строк 184-198 в triangle.cpp? В этих строчка…
Evgenii Legotckoi
Evgenii Legotckoi21 мая 2023 г. 11:57
Как написать игру на Qt - Урок 2. Анимация героя игры (2D) Добрый день. slotGameTimer срабатывает по таймеру и при каждой сработке countForSteps увеличивается на 1, это не зависит от нажатия клавиш, нажатая клавиша лишь определяет положение ножек, котор…
J
JonnyJo20 мая 2023 г. 17:27
Как написать игру на Qt - Урок 2. Анимация героя игры (2D) Евгений, здравствуйте! Подскажите, а почему при нажатии одной клавиши переменная countForSteps увеличивается не на 1, на 4, ведь одно действие даёт увеличение этой переменной только на единицу? …
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi16 апреля 2023 г. 10:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Да, это возможно. Но подобные вещи лучше запускать через celery. То есть drf принимает команду, и после этого регистрирует задачу в celery, котроый уже асинхронно всё это выполняет. В противном …
АБ
Алексей Бобров15 декабря 2021 г. 1:03
Sorting the added QML elements in the ListModel I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …
Evgenii Legotckoi
Evgenii Legotckoi29 марта 2023 г. 10:11
Замена поля ManyToMany Картинки точно нужно хранить в медиа директории на сервере, а для обращения использовать ImageField. Который будет хранить только путь к изображению на сервере. Хранить изображения в базе данных…
Evgenii Legotckoi
Evgenii Legotckoi24 апреля 2023 г. 9:22
Пакеты данных между сервером и клиентами Привет. Если классы имеют что-то общее в полях, а также общую идеологию и их можно вписать в иерархию наследования, то в первую очередь переписать так, чтобы один базовый класс объединял в…

Следите за нами в социальных сетях