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
d
  • dsfs
  • 26 квітня 2024 р. 14:56

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

  • Результат:80бали,
  • Рейтинг балів4
d
  • dsfs
  • 26 квітня 2024 р. 14:45

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

  • Результат:50бали,
  • Рейтинг балів-4
d
  • dsfs
  • 26 квітня 2024 р. 14:35

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

  • Результат:73бали,
  • Рейтинг балів1
Останні коментарі
k
kmssr09 лютого 2024 р. 05:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 12:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 21:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 19:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 грудня 2023 р. 08:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi03 травня 2024 р. 00:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 14:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 квітня 2024 р. 15:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 12:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 14:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

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