Andrei Yankovich
Andrei Yankovich27. Mai 2019 00:57

Bereitstellen von Qt- und QML-Anwendungen unter Linux und Windows

Einführung

In diesem Artikel sehen wir uns an, wie Sie alle Qt-Abhängigkeiten für Ihre dynamisch erstellte Anwendung korrekt erstellen.


Zunächst ein wenig Theorie.

Warum wird das benötigt?

Es gibt mehrere Möglichkeiten, Anwendungen zu erstellen, die wichtigsten sind:

  • Statische Montage.
    Die statische Assemblierung beinhaltet die Erstellung einer Binärdatei, die alle notwendigen Verweise darauf enthält. Mit anderen Worten, es enthält alles, was für seine Arbeit benötigt wird. Dieser Ansatz eignet sich für kleine Konsolenanwendungen mit wenigen Abhängigkeiten, da sonst die endgültige Binärdatei extrem groß wird.

  • Dynamische Montage.
    Sie unterscheidet sich von einer statischen darin, dass die Binärdatei nur den Quellcode Ihrer Anwendung enthält (die Größe der Binärdatei ist minimal), aber wenn Sie eine solche Anwendung ausführen, werden Bibliotheken von Drittanbietern benötigt, die beim Schreiben verwendet wurden es.

Nun eine kleine Beschreibung.

Console-QtDeployer ist ein einfaches Dienstprogramm ähnlich windeployqt und macdeployqt . Aber im Gegensatz zu Analogen hat es eine viel flexiblere Schnittstelle (Launch-Flags) und eine höhere Geschwindigkeit, außerdem unterstützt es 2 Plattformen Windows und Linux, was bedeutet, dass wir jetzt Abhängigkeiten für Windows auf Linux und umgekehrt aufbauen können.

Nehmen wir ein Beispiel.

Zum Beispiel habe ich eine einfache qt-Anwendung mit qml - MyApp geschrieben.

MeineApp (main.cpp)

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main (int argc, char * argv [])
{
    QCoreApplication :: setAttribute (Qt :: AA_EnableHighDpiScaling);

    QGuiApplication app (argc, argv);

    QQmlApplicationEngine engine;
    engine.load (QUrl (QStringLiteral ("qrc: /main.qml")));
    if (engine.rootObjects (). isEmpty ())
        return -1;

    return app.exec ();
}

MeineApp (main.qml)

import QtQuick 2.9
import QtQuick.Controls 2.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr ("Scroll")

    ScrollView {
        anchors.fill: parent

        ListView {
            width: parent.width
            model: 20
            delegate: ItemDelegate {
                text: "Item" + (index + 1)
                width: parent.width
            }
        }
    }
}

MyApp ist dynamisch verbunden, das heißt, es benötigt qt-Bibliotheken, um zu funktionieren.
Wenn wir versuchen, die Anwendung auszuführen, erhalten wir unmittelbar nach dem Build eine Fehlermeldung:

~/build-MyApp-Desktop_Qt_5_11_1_GCC_64bit4-Release $ ./MyApp ./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Qml.so.5: version `Qt_5 'not found (required by ./MyApp)
./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5: version `Qt_5 'not found (required by ./MyApp)
./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5.11 'not found (required by ./MyApp)
./MyApp: /usr/lib/x86_64-linux-gnu/libQt5Core.so.5: version `Qt_5 'not found (required by ./MyApp)

Aus ähnlichen Texten sehen wir, dass die Anwendung auf die Grafikbibliotheken qt und qml angewiesen ist. Das Finden und Erstellen aller Ressourcen (Bibliotheken und Plugins) wird viel Zeit in Anspruch nehmen.
Um Zeit und Mühe zu sparen, verwenden wir das Dienstprogramm CQtDeployer (Sie können es hier herunterladen).
oder im Snap Store installieren

Download aus dem Snap Store

cqtdeployer -bin myApp -qmake /media/D/Qt/5.12.3/gcc_64/bin/qmake -qmlDir ./

Nachdem Sie diesen Befehl ausgeführt haben, erhalten Sie eine vollständig fertige Anwendung, die mit einem fertigen Startprogramm funktioniert, das alle erforderlichen Umgebungen für Ihre Anwendung einrichtet, damit sie auf allen Linux-Computern funktioniert.

Allgemein

Nach dem Start der QtDeployer-Konsole sollte der Inhalt des Ordners mit Ihrer Anwendung wie folgt aussehen:

drwxr-xr-x 7 andrei andrei 4096 May 24 12:22 ./
drwxrwxr-x 3 andrei andrei 4096 May 24 12:22 ../
drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 bin/
drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 lib/
-rwx---rwx 1 andrei andrei  433 May 24 12:22 myApp.sh*
drwxr-xr-x 6 andrei andrei 4096 May 24 12:22 plugins/
drwxr-xr-x 5 andrei andrei 4096 May 24 12:22 qml/
drwxr-xr-x 2 andrei andrei 4096 May 24 12:22 translations/

cqtdeployer result

  • myApp.sh - Skript zum Starten Ihrer Anwendung
  • bin - Ordner mit Ihrer Binärdatei
  • lib - ein Ordner mit allen notwendigen Abhängigkeiten Ihrer Anwendung.
  • Plugins - qt-Plugins, die erforderlich sind, damit die Anwendung funktioniert
  • qml - qml-Abhängigkeiten.
  • Übersetzungen - Standard-QT-Übersetzungen.

So können Sie Ihre Anwendung für das Packen in ein Deb- oder Snap-Paket vorbereiten, wonach Sie mit der Verteilung beginnen können. Beachten Sie, dass Ihre Anwendung nach dem Start von cqtdeployer mit dem sh-Skript gestartet werden muss, das die erforderliche Umgebung für Ihre Anwendung einrichtet.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Ruslan Polupan
  • 21. Juni 2019 03:54
  • (bearbeitet)

Напишите прожалуйста пример запуска для Windows :-)

отбой Разобрался.... После линуха сложно :-)

Andrei Yankovich
  • 21. Juni 2019 04:24
  • (bearbeitet)

Возможно кому то пригодится

сqtdeployer для windows работает точно так же как и для Linux

разница лишь в команде запуска

  • Linux: cqtdeployer
  • Windows: %cqtdeployer%

Подробная инструкция использования под Windows:

  1. Качаем онлайн истолятор на момент версии 1.2.3 интерполятор не подписан, по этому Windows может ругаться.
  2. Устанавливаем
  3. Открываем cmd
  4. Пишем %cqdeployer%
Ruslan Polupan
  • 21. Juni 2019 04:31

Вот моя строка по которой все отлично сработало

%cqtdeployer% -bin c:/CentralMposKeys/CentalMposKeys.exe -qmake c:/Qt/5.12.2/mingw73_64/bin/qmake.exe
juvf
  • 28. Dezember 2021 23:56

написал приложение, холоворд на qt виджетах, без qml. Из визарда QtCreator. Собрал кросскомпилятором. Нужно перенести на таргет.

juvf@juvf-VirtualBox:~/qtWs/test/imx6/release$ ~/CQtDeployer/1.5/cqtdeployer.sh -bin test -qmake ~/soft/juvfTool/arm-buildroot-linux-gnueabihf/sysroot/home/juvf/tools/imx6/qt5_15_2_J/bin/qmake -qmlDir ./
Info: Deploy ...
Info: The targetDir option is not used. CQtDeployer will use default target dir :/home/juvf/qtWs/test/imx6/release/DistributionKit
Info: copy :/home/juvf/qtWs/test/imx6/release/test
Warning: Failed to extract qml! The qt qml dir is not initialized!
Warning: Failed to copy standard Qt translations
Info: deploy done!
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/bin/qt.conf
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/bin/test
Info: copy :/home/juvf/qtWs/test/imx6/release/DistributionKit/tmp_data/Application/test.sh
juvf@juvf-VirtualBox:~/qtWs/test/imx6/release$

после имею ТОЛЬКО скрипт test.sh и папку bin в которой два файла: само приложение test и файл qt.conf. Всё! Ни паки lib, ни plugin
перенёс всё на таргет. запускаю скриптом

./test.sh

/opt/argo/bin/test: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory

ну кагбэ неудевительно, что не может найти libQt5Widgets.so.5. Удевительно, что cqtdeployer не подтянул ни библиотеки, ни плагиины

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken