Развертывание Qt и QML приложений в Linux и Windows
Введение
В данной статье мы рассмотрим, как правильно собрать все зависимости qt для вашего приложения, которое было собрано динамически.
Для начало немного теории
Зачем это нужно?
Существует несколько способов сборки приложений, основные из них это:
Статическая сборка.
Статическая сборка подразумевает создание бинарника, в котором будут слинковоны все необходимые ему компоненты. Другими словами все что нужно для его работы будет лежать в нем. Такой подход удобен для маленьких консольных приложений, у которых мало зависимостей, в противном случае размер конечного бинарника будет крайне велик.
Динамическая сборка.
Отличается от статической тем, что в бинарнике будут лежать только исходные тексты вашего приложения (размер бинарника будет минимальный), но при выполнении такого приложения ему понадобятся сторонние библиотеки, которые использовались при его написании.
Теперь немного описания
Console-QtDeployer — это простая утилита, аналогичная windeployqt и macdeployqt . Но в отличие от аналогов имеет куда более гибкий интерфейс (флаги запуска) и более высокую скорость работы, к тому же она поддерживает 2 платформы windows и linux а это значит что теперь мы сможете собирать зависимости под windows на Linux и наоборот.
Давайте рассмотрим пример
Для примера я написал простое qt приложение с использованием qml — MyApp.
MyApp (main.cpp)
MyApp (main.qml)
MyApp слинкована динамически, то есть для работы ему требуются библиотеки qt.
Если попробовать запустить приложение, сразу после сборки мы получим ошибку:
Из сходных текстов мы видим, что приложение зависит от GUI библиотек qt и библиотек qml. Поиск и сборка всех ресурсов (библиотек и плагинов) займет очень много времени.
Чтобы сэкономить время и силы, мы воспользуемся утилитой CQtDeployer (скачать можно здесь )
или установить в Snap Store
После выполнения данной команды, вы получите полностью готовое для работы приложение с готовым лаунчером, который настроит все необходимое окружение для работы вашего приложения на всех машинах под управлением Linux.
Давайте подробнее рассмотрим некоторые из параметров CQtDeployer:
| Опция | Описание |
|---|---|
| help / h | Показывает справку |
| always-overwrite | Копирует файлы с заменой уже существующих |
| -bin [list, params] | Развертываемый файл или папка. пример -bin /my/project/bin.exe |
| -binDir [params] | Папка с развертываемыми файлами (с рекурсивным поиском). ВНИМАНИЕ! Этот флаг поддерживает только файлы ‘so’, ‘dll’ и ‘exe’. Если вы хотите развернуть бинарный файл Linux, используйте флаг ‘-bin’ |
| -qmlDir [params] | Папка qml. пример -qmlDir /my/project/qml |
| deploySystem | Копирует все библиотеки |
| -qmake [params] | Путь к qmake. пример |
| -qmake /Qt/5.11.1/gcc_64/bin/qmake | |
| -ignore [list,params] | Список библиотек для игнорирования |
| Пример -ignore libicudata.so.56,libicudata2.so.56 | |
| -ignoreEnv [list,params] | Список путей для игнорирования. |
| Пример -ignoreEnv /bad/dir,/my/bad/Dir | |
| clear | Удаляет все старые файлы (с прошлого запуска) |
| пример -runScript myApp.sh | |
| allQmlDependes | Извлекает все библиотеки qml. |
| (не рекомендуется, так как занимает много памяти) | |
| -libDir [list,params] | Устанавливает дополнительные пути к библиотекам |
| Пример -libDir /newLibs | |
| -extraPlugin [list,params] | Устанавливает дополнительный путь для extraPlugin приложения |
| -recursiveDepth [params] | Устанавливает глубину поиска библиотек (по умолчанию 0) |
| -targetDir [params] | Устанавливает целевой каталог (по умолчанию это путь к первому развертываемому файлу) |
| noStrip | Пропускает шаг strip |
| noTranslations | Пропускает файлы переводов |
| qmlExtern | Использует внешний сканер qml (qmlimportscaner) |
| не работает без qmake и в snap | |
| -verbose 3 | Показывает дебаг лога |
После выполнения cqtdeployer у вас появится папка Distro c уже готовым приложением со всеми его зависимостями содержимое этой папки должно выглядеть примерно следующим образом:
- myApp.sh — скрипт запуска вашего приложения
- bin — папка с вашим бинарником
- lib — папка со всеми необходимыми зависимости вашего приложения
- plugins — qt плагины, необходимые для работы приложения
- qml — зависимости qml.
- translations — стандартные переводы qt.
Таким образом можно подготовить ваше приложения для упаковки в deb или snap пакет, после чего можно приступить к его распространению. Учитывайте, что после выполнения cqtdeployer, ваше приложение необходимо запускать с помощью sh скрипта, который настроит для вашего приложения необходимое окружение.
Для Windows все точно так же. только в консоли нужно будет писать не cqtdeployer а %cqtdeployer%
Развертывание приложений qt в Linux
Решил поднять вопрос о развертывании приложений написанных с использованием qt в Linux подобных системах.
Данная проблема легко решается в системах под управлением windows и mac так как разработчики фреймворка подготовили для этого специальные утилитки (windeployqt и macdeployqt)
Под Linux к сожалению нет официальной утилиты. По этому я решил заняться этой проблемой и написать утилиту для развертывания qt приложения под Linux.
Теперь немного описания:
Console-QtDeployer — это простая утилита аналогичная (windeployqt и macdeployqt) доступна здесь.
Данная утилита слинкована статически, а значит, все что вам нужно — это положить ее рядом со своим бинарником и вызвать ее, передав в качестве параметров путь к вашему приложению и путь к исходникам qt.
Давайте рассмотрим пример:
я написал простое qt приложение MyApp.
MyApp слинкована динамически — то есть для работы ему требуются библиотеки qt
После выполнения данной команды вы получите полностью готовое для работы приложение с готовым лаунчером который настроит все необходимое окружение для работы вашего приложения на всех машинах под управлением Linux.
Давайте подробнее рассмотрим некоторые из параметров CQtDeployer
help — Показать справку
always-overwrite — Копирует файлы с заменой уже существующих
-bin [params] Исполняемый файл над которым будет выполнятся деплой (в нашем случае это было -bin MyApp. Вместо MyApp можно указать путь к вашему приложению)
-qmlDir [params] — Папка qml. пример -qmlDir
/my/project/qml — папка с qml файлами вашего приложения, данная опция нужна для приложений использующих qml
deploy-not-qt — Копировать все библиотеки (не только qt данная опция может быть нужна для приложений которые должны использоваться на Linux системах с ограниченным количеством библиотек)
-qmake [params] Путь к qmake. пример (здесь нужно указать путь к тем библиотекам qt с которыми вы собирали ваше приложение в нашем случае это был qt 5.11.1 )
clear — удалит все старые файлы (с прошлого запуска)
-runScript [params] — установить новое имя результирующего файла (AppRun.sh по умолчанию)
пример -runScript myApp.sh
Вот и все Если есть какие то вопросы по использованию или проблемы то пишите мне буду рад помочь разобраться с ними.
Qt Linux — Урок 001. Автозапуск Qt приложения под Linux
Поговорим, о том, как добавить в Qt приложение функционал по настройке автозапуска данного приложения. Например, у нас имеется окно настроек и мы хотим сделать возможность настройки автозапуска приложения из этого диалогового окна.
В отличие от автозапуска в Windows , где можно воспользоваться QSettings и внести изменения в реестр, в Linux потребуется создать специальный исполняемый файл, который будет отвечать за автозапуск приложения при входе пользователя в операционную систему.
Допустим название проекта и соответственно название исполняемого файла будет AutorunLinux, тогда потребуется создать исполняемый файл AutorunLinux.desktop по следующему пути:
Содержимое исполняемого файла нужно сделать аналогичным другим файлам автозапуска других приложений, чтобы гарантировано получить требуемый результат. В случае с Ubuntu Linux 15.04/15.10 содержимое файла получилось следующее:
Где параметр Exec указывает путь к исполняемому файлу приложения.
Также не забудьте сделать файл исполняемым:
Для того, чтобы гарантировано быть уверенным в правильности подготавливаемого содержимого файла автозапуска, рекомендую для начала добавить Ваше приложение в автозапуск с помощью стандартной утилиты Startup Applications .
Данная утилита создаст гарантированно рабочий вариант файла для Вашего приложения. После чего Вам останется только добавить содержимое через программный код с автоматической модификацией пути к исполняемому файлу приложения.
Структура проекта
Для демонстрации программного кода, предлагаю создать следующий проект, со следующим содержимым:
- AutorunLinux.pro — профайл проекта;
- widget.h — заголовочный файл главного окна приложения;
- widget.cpp — файл исходных кодов главного окна приложения;
- widget.ui — форма главного окна приложения;
- main.cpp — основной файл исходных кодов приложения.
В данном приложении будет чекбокс, по состоянию которого мы будет удалять и добавлять приложения в автозапуск при нажатии кнопки PushButton. При запуске приложения будет выскакивать сообщение, что приложение запущено. Внешний вид приложения следующий:
widget.h
В заголовочном файле из всех изменений будет только объявление слота для нажатия кнопки:
widget.cpp
В результате работы данного кода приложение будет вносить себя в автозапуск и запускаться при входе пользователя в систему. Для проверки работоспособности, создайте с помощью приложения файл автозапуска, выйдите из системы и войдите снова (Log Out/ Log In).
Исходный код проекта: AutorunLinux
Рекомендуем хостинг TIMEWEB
Рекомендуемые статьи по этой тематике




