c++ windeployqt - Bereitstellen von Qt 5 App unter Windows



standalone application (3)

Nach ein paar Stunden in den Qt-Foren habe ich herausgefunden, dass ich den Ordner "qml" (normalerweise in C: /Qt/5.2.1/qml) in das Stammverzeichnis der Anwendung kopieren muss. Danach arbeiteten sowohl die dynamische als auch die statische Version meiner Anwendung auf Vanilla-Systemen.

Programmverzeichnis (MinGW 4.8 32-Bit, dynamisch):

Wie sagte, verwenden Sie das Tool windeployqt ( <qt path>\<version>\bin\windeployqt.exe ), um die Nescesary-Dateien in den Ordner Ihrer Anwendung zu kopieren. Kopieren Sie anschließend die erforderlichen QML-Komponenten von <qt path>\<version>\qml\ in den Ordner Ihrer Anwendung. Der resultierende Ordner sollte wie folgt aussehen:

  • Plattformen (Ordner)
  • QtQuick (Ordner)
  • QtQuick.2 (Ordner)
  • Alle anderen QML-Komponenten, die Sie benötigen
  • app.exe
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • libstdc ++ - 6.dll
  • libwindthread-1.dll
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

Programmverzeichnis (statisch)

Kompilieren Sie die Anwendung statisch und kopieren Sie dann die erforderlichen QML-Komponenten von <qt path>\<version>\qml\ in den Ordner Ihrer Anwendung. Der resultierende Ordner sollte wie folgt aussehen:

  • QtQuick (Ordner)
  • QtQuick.2 (Ordner)
  • Alle anderen QML-Komponenten, die Sie benötigen
  • app.exe

Ich denke, der Grund für den Absturz war, dass die Qt5Gui.dll (dynamisch und statisch) "versuchte", die QtQuick * -Ordner während der Laufzeit zu laden, sie jedoch nicht finden konnte (wodurch die Anwendung während des Ladens abgestürzt ist).

Ich habe ein paar Anwendungen in QML (Teil von Qt 5) geschrieben. In einer Frage, die ich zuvor gemacht habe ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), habe ich die Lösung für die Bereitstellung meiner App gefunden OS X (mit dem macdeployqt-Tool).

Die Bereitstellung von Qt4-Apps unter Windows war einfach:

  1. Sie haben es im Freigabemodus kompiliert.
  2. Sie haben die erforderlichen Bibliotheken (DLLs) kopiert.
  3. Du hast es getestet und es hat funktioniert.

Leider funktionierte dieser Ansatz in Qt5 nicht (ich habe sogar den platforms-Ordner mit der qwindows.dll-Datei hinzugefügt und es hat nicht funktioniert). Nach einigen Tagen des Versuchs gab ich auf und kompilierte eine statische Version von Qt5.

Auch das hat nicht funktioniert. Die App funktioniert auf einem PC mit Qt installiert, aber es stürzt auf "sauberen" PCs ab. Als Nebenbemerkung geben Windows 8 / 8.1-Systeme keine Warnung oder eine Nachricht, die mich über den Absturz der App informiert. Aber in Windows 7 benachrichtigt mich eine Nachricht, dass die Anwendung abgestürzt ist.

Ich habe versucht, Abhängigkeit Walker (depends.exe) und alle Bibliotheken in der statischen Build meiner Anwendung schien gut.

In Windows 8 erhalte ich keinen Fehler. Aber nachdem ich die App in der Datei "depends.exe" profiliert habe, bekomme ich eine Zugriffsverletzung, die von QtGui.dll herrührt. Der genaue Fehler ist

Die zweite Ausnahme 0xC0000005 (Zugriffsverletzung) ist in "QT5GUI.DLL" unter Adresse 0x61C2C000 aufgetreten.

Gibt es etwas, das ich vermisse (sagen Sie eine zusätzliche DLL oder Konfigurationsdatei)?

Bewerbungs informationen:

  • Geschrieben und zusammengestellt mit Qt 5.2.1
  • Verwendet Quick / QML.
  • Verwendet das Netzwerkmodul.
  • Verwendet das Webkit-Modul.
  • Verwendet das Bluetooth-Modul.
  • Die QML-Dateien sind in Quick 2.2 geschrieben

Ab Qt 5.2 gibt es das windeployqt Tool, das Sie verwenden können. Führen Sie es einfach über die Befehlszeile aus, um Hilfe zu erhalten. Aber grundlegende Verwendung ist, geben Sie die .exe-Datei, es kopiert Qt Abhängigkeiten, um damit zu gehen.

Sie --qmldir Option --qmldir , um das Tool wissen zu lassen, wo sich Ihre QML-Dateien befinden, damit es die erforderlichen QML-Abhängigkeiten ermitteln kann.

Hinweis zum Testen: Stellen Sie sicher, dass Sie alles haben, testen Sie den Computer ohne Qt SDK oder benennen Sie das Qt-Verzeichnis vorübergehend um . Andernfalls findet die Anwendung möglicherweise fehlende Dateien von dort ...


In PowerShell ist es gcm , das formatierte Informationen über andere Befehle gibt. Wenn Sie nur den Pfad zur ausführbaren Datei .Source möchten, verwenden Sie .Source .

Zum Beispiel: gcm git oder (gcm git).Source

Leckerbissen:

  • Verfügbar für Windows XP.
  • Verfügbar seit PowerShell 1.0.
  • gcm ist ein Alias ​​des Get-Command Cmdlets .
  • Ohne irgendwelche Parameter listet es alle verfügbaren Befehle auf, die von der Host-Shell angeboten werden.
  • Sie können einen benutzerdefinierten Alias ​​mit Set-Alias which gcm und wie Set-Alias which gcm verwendet: (which git).Source .
  • Offizielle Dokumente: https://technet.microsoft.com/en-us/library/ee176842.aspx




c++ windows deployment qt