QT Deploy on Windows



  • Hallo zusammen.

    Wollte heute mal eine simple Applikation weiterleiten und stieß dabei beim Deployment auf ein Problem. Ich bin wie folgt vorgegangen:

    Ich habe das Projekt (QtQuick-Projekt) gebuilded via MinGW32-Release (das Problem tritt auch bei MSVC auf). Dann habe ich "Qt 5.13.2 (MinGW 7.3.0 32-bit)" gestartet. Darin hab ich dann unter "5.13.2\mingw73_32\bin" die "windeployqt.exe" ausgeführt und als Parameter den Release Ordner angegeben. Daraufhin hat wurden wie vorgesehen sämtliche Laufzeitdateien hinzugefügt. Soweit so gut. Starte ich allerdings nun meine .exe passiert genau garnichts. Sie öffnet sich nicht und ich bekomme leider nicht mal ne Fehlermeldung um die Ohren geworfen.
    Auch ohne windeployqt (habe alle fehlenden Dateien kopiert + plattforms-Ordner mit qwindows.dll + libGLESv2.dll) komme ich zum gleichen Problem. Habt ihr eine Ahnung woran das liegen könnte? Habe ich einen typischen Anfängerfehler begangen?

    Ich freue mich auf eure Antworten 😃 👍🏻



  • Und der Debug-Build läuft aber bei dir?
    Dann erzeuge mal einen Relase-Build mit Debug-infos und debugge deinen Code.

    Würden DLLs fehlen, so käme von Windows eine Fehlermeldung beim Starten.
    Du könntest aber auch mal mit dem Dependency Walker überprüfen, ob die richtigen DLLs herangezogen werden.



  • Also der Debug-Build läuft ebenfalls nicht.
    Der DependencyWalker mecker dauerhaft weil er was nicht finden konnte. Aber einen Hoffnungsschimmer gibt es: "Initial deployment (Quick and dirty)" - Methode auf https://wiki.qt.io/Deploy_an_Application_on_Windows funktioniert bei mir. Ich könnte nun per try and error mal schauen was er wirklich braucht, da ich ungern 4,87GB verschicken möchte für ein Fenster mit einem Button^^



  • Die Fehlermeldung beim Dependency Walker bzgl. der "delayed loaded DLLs" kannst du ignorieren.
    Schau dann einfach oben links die Liste der DLLs an, welche vom Programm benötigt werden.



  • Oben links sagt mir der Dependency Walker nur QT5CORE, QT5GUI, QT5QML, LIBGCC_S_DW2-1.DLL und LIBSTDC++-6.DLL. Mit denen allein läuft es aber nicht. Auf meinem Laptop benötige ich

    libgcc_s_dw2-1.dll
    libstdc++-6.dll
    libwinpthread-1.dll
    Qt5Core.dll
    Qt5Gui.dll
    Qt5Network.dll
    Qt5Qml.dll
    Qt5Quick.dll
    Qt5QuickControls2.dll
    Qt5QuickTemplates2.dll
    

    Auf meinem PC hingegen, wo sogar auch QT installiert ist, benötige ich zusätzlich den platforms-Ordner, den QtQuick-Ordner und QtQuick.2-Ordner. Das vermittelt nicht gerade ein ruhiges Gewissen wenn man nicht mal genau weiß, was bei jemanden anderen noch fehlen könnte



  • Jede DLL hat weitere abhängige DLLs, welche im Baum durch Aufklappen per '+' angezeigt werden.

    Für dich ist aber wohl die Liste "Module" besser geeignet.
    Am besten du aktivierst per "F9" die Anzeige der "Full Paths".
    Dann scrollst du zu den QT- und MinGW32-Libs (die ganzen Einträge mit dem gelben Warnzeichen kannst du auch hier ignorieren, dies sind zum großen Teil Wrapper DLLs für .NET Assemblies) und merkst dir deren Verzeichnisse/Unterverzeichnisse: nur diese sollten dann in deinem Deploy enthalten sein.
    Ich hoffe mal, daß QT sowie MinGW32 bei der Installation keine zusätzlichen DLLs in das Windows/System32-Verzeichnis kopiert haben (sonst müßtest du diese ja auch mitausliefern).

    Vorher mußt du jedoch natürlich eine lauffähige Anwendung haben (sonst macht es ja keinen Sinn diese auszuliefern).
    Mit welcher IDE entwickelst du denn?



  • Für Qt gibt es ein tool welches das ganze vereinfacht:
    https://doc.qt.io/qt-5/windows-deployment.html



  • @Th69 ich schaue gleich morgen früh

    @firefly das habe ich doch verwendet 😃



  • Ich entwickle mit QtCreator. Zumindest wenn ich GUI-Anwendungen mache. Wenn ich alle .dll's die ich herausfinde (mit deinen letzten Empfehlungen) mit dazu packe funktioniert es trotzdem nicht. Dann meckert erstmal Windows, dass noch welche fehlen. Wenn ich die noch dazu packe läuft es weiterhin nicht. Dann meckert Windows zwar nicht, aber es startet einfach nicht. Wenn ich daraufhin noch weitere .dll's hinzufüge die ich per try and error rausgefunden habe, startet die Anwendung immerhin auf dem Laptop. Und erst wenn ich dann noch die oben besagten drei Ordner dazugebe würde die Anwendung auch auf meinem PC laufen. Ich hänge dir die .exe einfach mal an. Mal schauen was du herausfinden kannst @Th69 .

    https://workupload.com/file/3a2LXqVA

    PS: Soviel steckt da auch nicht drin. Ist ja nur ein Test. Die main.cpp hab ich so gelassen und die main.qml beinhaltet lediglich

    import QtQuick 2.6
    import QtQuick.Controls 2.5
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
        property int foo: 0
    
        Button {
            anchors.centerIn: parent
            text: "Press me"
            onClicked: {
            }
        }
    }
    


  • Ich habe weder Qt noch MinGW hier installiert, daher kann ich es auch nicht ausführen.

    Taucht der Prozess denn im TaskManager auf? Wenn ja, dann sind alle DLLs gefunden worden und die Anwendung hat (einfach nur) einen Fehler im Start-Code (und dann solltest du das auch debuggen können, d.h. einfach das Programm pausieren lassen und schauen, in welchem Code (bzw. in welcher DLL) sich das Programm aufgehängt hat).



  • Nein, der Prozess taucht nicht im Taskmanager auf. Aber ich habe es jetzt geschafft und weiß nun warum ich solche Probleme hatte. Das Problem saß natürlich wieder vor dem PC. Oben schrieb ich folgendes:

    @Zhavok sagte in QT Deploy on Windows:

    Dann habe ich "Qt 5.13.2 (MinGW 7.3.0 32-bit)" gestartet. Darin hab ich dann unter "5.13.2\mingw73_32\bin" die "windeployqt.exe" ausgeführt und als Parameter den Release Ordner angegeben.

    dumm nur, dass bei QML Projekten auch der Parameter --qmldir <directory> angegeben werden sollte 😅 . Um die enorme Menge an nutzlosen Daten loszuwerden habe ich noch mehr Argumente verwendet. Das ganze sieht aktuell bei mir so aus:

    windeployqt.exe C:\CPP\Projects\build-TempQML-Desktop_Qt_5_13_2_MinGW_32_bit-Release\release --no-translations --no-patchqt --no-virtualkeyboard --no-webkit2 --no-opengl-sw --qmldir C:\Qt\Qt5.13.2\5.13.2\mingw73_32\qml --plugindir C:\CPP\Projects\build-TempQML-Desktop_Qt_5_13_2_MinGW_32_bit-Release\release\Plugins
    

    Damit läufts. Manches davon sehe ich trotzdem als sinnlos an. Die Plugins könnte man eigentlich komplett weglassen bis auf platforms\qwindows.dll. Glaube nicht, dass ich bei diesem Projekt \audio\ ... benötige^^. Aber egal. Es funktioniert schonmal und es macht alles automatisch ohne viel Gesuche von .dll's. Damit bin ich erstmal zufrieden 🙂
    Schade ist nur etwas, dass ein einfaches Projekt mit einem Button zu 788 Dateien wird^^

    Vielen Dank für eure Hilfe und Geduld. Das hat mir wirklich weitergeholfen. Jetzt hab ich auch schonmal den DependencyWalker kennengelernt^^.



  • Eine Frage hätte ich doch mal noch. Einige .dlls bleiben trotzdem übrig die ich löschen könnte und die Anwendung immernoch funktioniert hat. Kann man davon ausgehen, dass es während der Laufzeit doch zu Problemen kommen kann weil eine .dll fehlt? Also um es besser zu formulieren: Läd die Anwendung beim Start direkt alle .dll's die sie während der Laufzeit benötigen könnte oder erst dann wenn sie benötigt wird?



  • @Zhavok sagte in QT Deploy on Windows:

    Läd die Anwendung beim Start direkt alle .dll's die sie während der Laufzeit benötigen könnte oder erst dann wenn sie benötigt wird?

    Das kommt darauf an ob statisch oder dynamisch gelinkt wird. Ich kann mir kaum vorstellen daß die Qt-Dlls sich gegenseitig zur Runtime dynamisch laden.



  • Ich linke dynamisch. Kenne mich mit den Lizenzen noch nicht so gut aus, dass ich da in kein Fettnäpfchen treten will 😅




Anmelden zum Antworten