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
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/
- 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.
Напишите прожалуйста пример запуска для Windows :-)
отбой Разобрался.... После линуха сложно :-)
Возможно кому то пригодится
сqtdeployer для windows работает точно так же как и для Linux
разница лишь в команде запуска
Подробная инструкция использования под Windows:
Вот моя строка по которой все отлично сработало
написал приложение, холоворд на 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 не подтянул ни библиотеки, ни плагиины