mafulechka
mafulechka23 квітня 2020 р. 04: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 хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах