mafulechka
mafulechka23 апреля 2020 г. 4: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 хостинг.

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

Комментарии

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

C++ - Тест 002. Константы

  • Результат:41баллов,
  • Очки рейтинга-8
E

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

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

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

  • Результат:53баллов,
  • Очки рейтинга-4
Последние комментарии
Evgenii Legotckoi
Evgenii Legotckoi3 декабря 2023 г. 19:39
Django - Урок 059. Сохранение выбранного языка в настройках пользователя It is redirect from untranslated url to translated url. It is normal behavior for mutlilanguage web site based on the Django.
c
coder552 декабря 2023 г. 4:34
Django - Урок 059. Сохранение выбранного языка в настройках пользователя It tries to do language translation in API views. That's why it sends or receives the same API request twice. Do you have any suggestions on this? Example: stripe webhook. "GET /warehouse/…
g
gr104712 ноября 2023 г. 21:35
Qt/C++ - Урок 035. Скачивание файла по HTTP с помощью QNetworkAccessManager Добрый день. Изучаю Qt на ваших уроках. Всё нормально работает на Linux. А под Win один раз запустилось, а сейчас вместо данных сайта получается ошибк "Unable to write". Куда копать, ума не…
D
Damir2 ноября 2023 г. 13:41
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC С CMake всё на много проще: find_package(Boost)
Павел Дорофеев
Павел Дорофеев29 октября 2023 г. 0:48
Как написать свой QTableView Итак начинаем писать свои виджеты на основе QAbstractItemView. А что так можно было?
Сейчас обсуждают на форуме
BlinCT
BlinCT30 ноября 2023 г. 20:18
Сборка проекта Qt6 из под винды на удаленой машине Всем привет. Сталкнулся с такой странностью: надо собирать проект из под 10 винды на удаленой линуксовой машине, проект строится на QT6, но вот когда cmake генерит свой кеш то вылитает…
Evgenii Legotckoi
Evgenii Legotckoi19 ноября 2023 г. 19:14
CKEditor 5 и подсветка синтаксиса. Добрый день. Я устал разбираться с CKEditor и просто перешёл на использование самописного markdown редактора...
Виктор Калесников
Виктор Калесников20 октября 2023 г. 14:29
Контакты Android делал в далеком 2017г поэтому особенно ничего не подскажу. Это основные методы получения данных с андроида используя Qt. Там еще какоето колдунство с манифестом. Андроидом давно не занимаюс…
m
mihamuz19 октября 2023 г. 0:03
Скачать Qt 6 Сработал следующий алгоритм. Инстолятор скачал используя это https://freevpnplanet.com/ru/ как расширение браузера. Потом установил это https://freevpnplanet.com/ru/ же на ПК и через инстолятор …

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