Qt Widget Projekt portabel machen



  • Hallo,

    die exe Datei von einer Konsolenanwendung ist portabel und lässt sich problemlos öffnen.
    Die exe Datei eines Qt-Widget-Projekts aber nicht. Erst kommen Fehlermeldungen, dass einige dll Dateien fehlen.
    Nachdem ich die alle runtergeladen und in den Ordner kopiert habe, kommt:
    Die Anwendung konnte nicht korrekt gestartet werden (0xc000007b).



  • Das hat nichts mit dem Projekttyp zu tun, sondern nur, welche externen Libraries eingebunden sind.

    Entweder die Qt-DLLs zusammen mit der Anwendung in denselben Ordner packen oder aber die Qt-DLLs statisch linken.

    Ich tippe darauf, daß du die falschen DLLs heruntergeladen hast (z.B. x86 vs. x64)!



  • Ich habe die x64 DLLs, weil ich ein x64 System habe. Diese sind im selben Ordner wie die exe Datei.
    Wenn etwas mit einer DLL nicht stimmt, müsste doch eigentlich eine Fehlermeldung kommen,
    die etwas über DLLs aussagt. So wie wenn diese gar nicht vorhanden sind.
    Es kommt aber: (0xc000007b). Beim Erstellen des Projekts sind die Häkchen sowohl bei
    Desktop Qt ... 32 bit als auch bei Desktop Qt ...64 bit gesetzt.



  • Nein, muss es nicht. Die einzigen Informationen, die in der Dll stecken, sind Namen der exportierten Funktionen. Das sagt aber z.B. noch nichts über Parameter. Wenn die Funktionen einen Zeiger erwartet, und du keinen übergibst, weiß sie nichts davon und tut so, als ob du einen übergeben hättest und greift auf zufälligen Speicher zu.
    Die Dlls müssen schon genau zu dem Stand passen, mit dem du gebaut hast.



  • Es lag an den x64 x32 Versionen. Ich habe jetzt alle x32 runtergeladen und in den Ordner kopiert.
    Musste dann sogar noch mehr DLLs runterladen.
    Jetzt kommen aber andere Fehlermeldungen:
    Der Prozedureneinsprungpunkt ... Qt5Guid.dll wurde nicht gefunden.
    Der Prozedureneinsprungpunkt ... Qt5Widgetsd.dll wurde nicht gefunden.



  • Erwartest du jetzt nochmal eine Antwort? Immer noch, das heißt, dass das nicht zu dem Stand passt, gegen den du gebaut hast.



  • Warum benutzt du nicht die DLLs von dem Entwicklungsrechner?



  • @theAnfänger77 sagte in Qt Widget Projekt portabel machen:

    Es lag an den x64 x32 Versionen. Ich habe jetzt alle x32 runtergeladen und in den Ordner kopiert.
    Musste dann sogar noch mehr DLLs runterladen.
    Jetzt kommen aber andere Fehlermeldungen:
    Der Prozedureneinsprungpunkt ... Qt5Guid.dll wurde nicht gefunden.
    Der Prozedureneinsprungpunkt ... Qt5Widgetsd.dll wurde nicht gefunden.

    Hast du eine Debug-Version gebaut?

    Die Debug-DLLs von QT enden immer auf 'd'. Darauf solltest du achten. Wenn du eine Exe ausliefern/anderswo nutzen willst, solltest du eine Releaseversion bauen und dann aus dem Verzeichnis deiner QT-Installation die passenden DLLs (ohne 'd' am Ende ) raussuchen.

    Darüber hinaus musst du nie DLLs runterladen. Die sind alle in deiner QT-Installation vorhanden.



  • Vielen Dank für die Antworten. Jetzt habe ich eine Release-Version gebaut und mir genau die
    passenden DLLs aus der Installation geholt und in den Ordner kopiert, wo die exe Datei ist.
    Das Programm startet allerdings immer noch nicht.
    Jetzt kommt noch nicht einmal mehr eine Meldung.



  • Das könnte jetzt aber einfach ein Fehler von dir sein. Kannst du das aus dem Debugger heraus starten? Dann solltest du sehen, was schiefgeht.



  • Im Qt Creator lässt sich eine Debug Version ohne Probleme starten.
    Eine Release Version jedoch nicht. Die Fehlermeldung lautet einfach nur:
    Das Programm ist abgestürzt.



  • @theAnfänger77 sagte in Qt Widget Projekt portabel machen:

    Im Qt Creator lässt sich eine Debug Version ohne Probleme starten.
    Eine Release Version jedoch nicht. Die Fehlermeldung lautet einfach nur:
    Das Programm ist abgestürzt.

    In dem Fall solltest du das Problem so lange reduzieren, bis du den Fehler eingekreist hast. Klingt danach, als würdest du irgendwo auf Speicher zugreifen, der dir nicht (mehr) gehört.

    Mir hilft es dann immer wenn ich mit Assertions arbeite und alle möglichen Fälle in allen kritischen Funktionen abprüfe.

    Als Beispiel:

    void meineWichtigeFunktion( int a, int b )
    {
        assert( a >= 0 );
        assert( b == 1 || b == 2 || b == 3 );
       ...
    }
    

    Somit stellst du sicher, dass Variablen nur Zustände haben, die du vorgesehen hast.



  • Du kannst auch in der Release-Version mit Debug-Infos kompilieren (schau mal in den Projektoptionen).


Anmelden zum Antworten