- Развертывание Qt и QML приложений в Linux и Windows
- Введение
- Для начало немного теории
- Зачем это нужно?
- Теперь немного описания
- Давайте рассмотрим пример
- MyApp (main.cpp)
- MyApp (main.qml)
- Как выпустить приложение Qt / C ++ для Linux и Windows?
- Решение
- Другие решения
- Сборка и компиляция под Linux
- Решение
- Решение
- QtCreator: Qt кросс-компиляция из linux 64 в linux 32, win32, win64 и Mac OS X; upx, usb, dmg, etc
Развертывание 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 1 | Показывает дебаг лога |
После выполнения cqtdeployer у вас появится папка Distro c уже готовым приложением со всеми его зависимостями содержимое этой папки должно выглядеть примерно следующим образом:
- myApp.sh — скрипт запуска вашего приложения
- bin — папка с вашим бинарником
- lib — папка со всеми необходимыми зависимости вашего приложения
- plugins — qt плагины, необходимые для работы приложения
- qml — зависимости qml.
- translations — стандартные переводы qt.
Таким образом можно подготовить ваше приложения для упаковки в deb или snap пакет, после чего можно приступить к его распространению. Учитывайте, что после выполнения cqtdeployer, ваше приложение необходимо запускать с помощью sh скрипта, который настроит для вашего приложения необходимое окружение.
Для Windows все точно так же. только в консоли нужно будет писать не cqtdeployer а %cqtdeployer%
Как выпустить приложение Qt / C ++ для Linux и Windows?
Я разработал приложение на C ++, используя Qt для графического интерфейса, и теперь я хотел бы выпустить его для Linux и Windows.
Я просматривал документацию, форумы и учебные пособия, но я не могу понять, что нужно сделать …
Я довольно запутался между различными используемыми терминами: в чем разница между выпуском и развертыванием? когда вам нужен установщик и, если нужно, как его создать?
Каковы различные шаги для создания .exe Windows? и его эквивалент для разных версий Linux (Debian, Ubuntu, Ubuntu Mate)?
В настоящее время я нахожусь на Ubuntu и использовал Qt Creator для кодирования приложения.
Насколько я знаю, мне нужно развернуть общие библиотеки.
Любая помощь, ответ, руководство или документация для начинающих будет очень полезна и очень приветствуется 🙂
Решение
Есть несколько способов развернуть ваше приложение
1. Разверните ваше приложение с помощью windeployqt / linuxdeployqt
Это самый простой способ, windeployqt или linuxdeployqt — это приложение, которое скопирует все необходимые зависимости в вашу исполняемую папку. Готов к запуску на другом компьютере.
- Скомпилируйте ваш бинарный файл в режиме релиза
- Откройте консоль разработчика Qt и введите windeployqt «C: \ folder \ of \ your \ исполняемый файл» (linuxdeployqt будет очень похожим)
- Все библиотеки, необходимые для запуска приложения на другом компьютере, будут скопированы в папку вашего приложения. Вы можете создать архив и отправить его кому-то еще.
Замечания: linuxdeployqt является сторонним.
2. Статическая сборка
Статическая сборка в конце будет представлять собой один двоичный файл, включающий весь код Qt. Вы можете отправить свой двоичный файл кому-либо, дополнительные библиотеки не требуются для его запуска. Исполняемый файл больше, так как весь код Qt связан внутри вашего исполняемого файла.
- Скачать Исходный код Qt
- Распакуйте его в папку
- Откройте консоль разработчика вашего установленного компилятора (т.е. MingW или MSVC)
Перейдите в папку и введите
./configure -static -static-runtime
3. Автономный / Онлайн установщик
Этот шаг требует некоторого чтения и тонкой настройки. Qt поставляется с IFW (Installer Framework), где вы можете создавать онлайн и автономные установщики. Установщик будет содержать .7z файл вашего исполняемого файла и все зависимости. Установщик более удобен для пользователя. Может создавать ярлыки, проверять доступное дисковое пространство и т. Д.
IIRC вам нужно собрать установщик статически для MSVC или вы должны отправить библиотеки времени выполнения. При сборке с MingW вам, вероятно, не понадобятся какие-либо библиотеки времени выполнения.
Это зависит от вас, какой метод вы выберете. Если у вас есть коммерческая лицензия, вы можете отправлять все свои закрытые исходные коды в виде статических сборок, но в целом лучше отправлять их как динамические сборки, особенно если вы используете OpenSSL, где пользователи могут быстро обмениваться уязвимыми библиотеками самостоятельно, если это необходимо.
Другие решения
Насколько я знаю, мне нужно развернуть общие библиотеки.
Возможно нет. Во-первых, обратите внимание, что вы выпускаете не для Linux (в целом), а для конкретного дистрибутива Linux. Детали имеют значение и отличаются в Ubuntu 15, Ubuntu 16, Debian 9, Fedora … и т. Д.
(Я полагаю, что это может быть то же самое в Windows: версия Windows может иметь значение, поэтому Windows 7 отличается от Windows 10)
Вы должны предпочесть использовать установленный Qt в целевом дистрибутиве Linux (его младшая версия будет отличаться от одного дистрибутива к другому).
Вы, вероятно, хотите сделать пакет программного обеспечения , для менеджер пакетов вашего целевого дистрибутива Linux. На Debian или Ubuntu это было бы .deb пакет .
(Вы не можете быть уверены, что ваш .deb для Ubuntu будет работать для Debian, но это обычно так)
Менеджер пакетов обрабатывает зависимости. Так что если ваш пользователь установит правильный .deb предоставленный вами, менеджер пакетов либо потерпит неудачу, либо (чаще) загрузит и установит все необходимые зависимости (например, Qt).
(Или вы можете распространять исходный код — возможно, как бесплатно программное обеспечение -, и оставьте задачу его компиляции вашим пользователям или распространителям)
Как сделать пакет для Linux хорошо задокументировано конкретным дистрибутивом, на который вы нацелены, и это другой вопрос. Для Debian смотрите Вот .
Сборка и компиляция под Linux
Сборка и компиляция Qt приложения под Windows
Доброго времени суток! Столкнулся с проблемой компиляции проекта в ОС Windows. Дело в том ,что я.
QT компиляция из Windows под Linux
Поделитесь, если не сложно, линком как сие делать.
Компиляция Qt 4.8.7 приложения под Linux
Здравствуйте! С Linux’ом практически никогда не работал, поэтому в этой теме абсолютный ноль, очень.
Компиляция под Windows из Linux
Компиляция под Windows из Linux — возможно ли это? По идее как-то можно с MinGW, есть у кого опыт?
Поискать его в папках куда ставился Qt.
то выскакивает сообщение qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory
Добавлено через 5 минут
qmake есть в папке с установкой /opt/Qt/5.5/gcc_64/bin/qmake и это путь прописан в настройках qtcreator
Ну вот от туда и запускай.
Добавлено через 5 минут
Что-то типа:
Интересно почему изначально не работает, а нужно производить какие-то манипуляции?
А что делают команды?
Решение
Прописывает другие пути.
Собственно раньше вроде как Qt ставился «по нормальному» как это принято в обычные системные папки, а теперь почему-то в /opt т.е в «изгои». Как инсталятор прописывает пути и как QtСreator их подтягивает загадка.
Решение
Стоит понимать что есть часть/библиотеки которые нужны для программы написанных на Qt, а есть еще часть которая нужна для разработки т.е. сама IDE QtCreator, набор рабочих утилит итд.
Т.е. это морока, я бы как бы не парился с этим.
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Кросс компиляция под Win из Linux
Я вроде как собрал qmake для компилятора mingw, собрал библиотеки Qt, но компилировать не.
Qt сборка проекта под Linux
Здравствуйте! Имею проект написанный из под Windows. Хочу собрать debug-сборку под Linux.
Сборка проекта под ARM Linux из Debian
Привет всем. Работаю в: Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.65-1+deb7u2 i686 GNU/Linux.
Компиляция под linux с mingw
Задача: скомпилировать программу для linux(elf) из под windows, используя mingw. Добавлено через.
QtCreator: Qt кросс-компиляция из linux 64 в linux 32, win32, win64 и Mac OS X; upx, usb, dmg, etc
Библиотека Qt позволяет делать действительно кроссплатформенные приложения. Единожды написанный код можно откомпилировать под многие операционные системы. Но проблема именно в слове «компилировать», т.к. подразумевается, что необходимо перезагрузиться под целевую систему, иметь в ней настроенную среду разработки, установленный и настроенный зоопарк библиотек. Спасает кросс-компиляция — компиляция, производящая исполняемый код для платформы, отличной от той, на которой исполняется.
Кросс-компиляция для Windows 64
Обычно одной из наиболее востребованных проблем является сборка Windows-версии своего приложения, изначально разрабатывающегося под Linux. Пример решения этой проблемы можно увидеть тут или на русском. Необходимо создать mkspecs-конфигурацию, положить файлы Qt в соответствующие директории и всё. Компилировать Qt в таком случае не обязательно, можно скачать бинарники с официального сайта.
У такого подхода есть несколько минусов: 1) QtCreator об установленной таким образом библиотеке ничего не знает; 2) Официальной сборки Qt для Windows x64 не существует. И если с первой проблемой ещё как-то можно бороться, то против второй поможет только компиляция…
Перед кросс-компиляцией не забудьте поставить непосредственно сам кросс-компилятор (ищется в пакетом менеджере по названию «mingw»). И скачать исходники qt-everywhere с официального сайта. В директории mkspecs распакованного архива копируем папку win32-g++ в win64-x-g++ и корректируем содержимое файла qmake.conf. У меня получилось следующее:
По сути в файле спецификации были заменены только пути.
Я выполнял configure со следующими параметрами:
./configure -xplatform win64-x-g++ CROSS_COMPILE=x86_64-w64-mingw32- -prefix /usr/local/qt4win64 -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-multimedia -no-qt3support -fast -nomake demos -nomake examples -nomake tools -device-option -little-endian -qt-zlib -qt-libpng -qt-libjpeg -openssl-linked -no-fontconfig -no-3dnow -no-ssse3 -continue
Здесь собираю минимальную версию Qt без webkit, phonon, multimedia и т.п. Полный список опций можно посмотреть по команде ./configure —help
Соответственно, для такой сборки должен быть установлен пакет g++-mingw-w64-x86-64, содержащий в себе x86_64-w64-mingw32-g++ (в убунту пакет надо ставить отдельно).
Далее make && sudo make install. На первом этапе компиляции используется родной системный компилятор, он собирает необходимые утилиты для linux, которые будут использоваться для сборки уже windows-бинарников.
После установки у меня в /usr/local/qt4win64/bin лежат PE32+ DLL и несколько ELF 64-bit LSB executable, в том числе: qmake, uic, moc, rcc. Вот они то и пригодятся для QtCreator!
После установки не удаляйте распакованную директорию — она используется.
Кросс-компиляция для Windows 32
Аналогична компиляции для Win64. За исключением того, что есть официальная сборка, и саму библиотеку компилировать не нужно! Достаточно собрать qmake, uic, moc, rcc.
Кросс-компиляция для Mac OS X
Кросс-компиляция для мака тоже очень похожа, за исключением того, что надо будет собрать и компилятор. Я собирал по этой инструкции. Это отняло полный день времени и кучу нервов. В процессе будет нужна рабочая Mac OS X (как минимум на виртуальной машине) с установленным XCode, чтобы взять оттуда необходимые файлы. При компилировании своих Qt-приложений запущенная Mac OS X не нужна.
Помните, в Mac OS X для линковки с библиотекой .a-файлы не нужны.
Настройка QtCreator
Сначала нужно добавить в список все установленные компиляторы. Инструменты — Параметры — Сборка и запуск — Инструментарии:
QtCreator обычно нормально определяет ABI, но лучше перепроверить. Так же можно заметить, что системный x64 GCC в linux умеет генерировать и 32-битные приложения. Однако это не отменяет того, что также необходимы 32-битные версии библиотек.
После компиляторов можно добавить профили Qt:
Вот при добавлении профиля и пригодятся собранные ранее qmake, uic, moc, rcc, ведь нужно выбрать директорию с qmake. Жёлтый значок с восклицательным знаком слева от профиля означает warning, но QtCreator может использовать такой профиль Qt. А вот если значок красный, то профиль нерабочий. Такое может случиться при неправильной структуре каталогов. Или если удалить директорию, в которой компилировали Qt.
Следующие настройки нужно делать в каждом создаваемом проекте.
Для добавления конкретного профиля Qt надо при активном проекте зайти на вкладку «Проекты» (Ctrl+5):
По умолчанию в списке «Изменить конфигурацию сборки» есть только системный профиль Qt. Зато в списке кнопки «Добавить» есть все профили Qt, добавленные в параметры сборки.
В основных настройках сборки необходимо проверить пару библиотека-компилятор. Чтоб и то и другое было от одной и той же операционной системы.
Этапы сборки «qmake» и «Сборка» QtCreator ставит по умолчанию. А вот особые этапы «upx» и «dmgbuild» я добавил вручную для своего проекта. Этап «upx» выполняется каждый раз при нажатии на кнопку «Собрать проект». Однако если исполняемый файл не был изменён, то upx вернёт ошибку, что файл им уже обработан. В случае ошибки следующий этап не вызывается, т.е. dmg-файл обновится только если upx отработал успешно.
Для работы этапа upx он должен быть установлен в системе. Однако даже работая в linux-окружении и поставленный из пакетного менеджера upx умеет ужимать приложения: linux32/64, win32, macos32/64. Далеко не для всех проектов upx-сжатие реально нужно, этап показан скорее для примера.
Для этапа «dmgbuild» я воспользовался скриптом make_dmg. Ему нужны права root, поэтому добавил скрипт в файл /etc/sudoers
Изменения в проектном файле и использование сторонних библиотек
В моём проекте используется libusb, а это далеко не часть Qt. Также необходимо было включить платформенно-зависимую реализацию HID. В проектный файл были добавлены строки:
В Mac OS X и Linux линкуемся с системной libusb, в Windows в зависимости от разрядности линкуемся с libusb-1.0-32.dll.a или libusb-1.0-64.dll.a. Помним, что .a-файл может быть переименован, но зависеть приложение всё-равно будет от libusb-1.0.dll. В Linux параметры для libusb берём через системную утилиту pkgconfig. Кроме libusb подключаем для каждой операционной системы необходимые системные библиотеки и иконки.
Удобно разнести итоговые файлы для разных операционных систем по директориям. Сделать это можно так:
Цель win64-x-g++ относится к win32, однако в проектном файле идёт последней и переписывает настройки.