web-dev-qa-db-fra.com

Déployer Qt 5 App sur Windows

J'ai écrit quelques applications en QML (partie de Qt 5). Dans une question que j'ai posée auparavant ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), j'ai trouvé la solution pour déployer mon application sur OS X (à l'aide de l'outil macdeployqt).

Le déploiement d'applications Qt4 sur Windows a été facile:

  1. Vous l'avez compilé en mode release.
  2. Vous avez copié les bibliothèques nécessaires (DLL).
  3. Vous avez testé et cela a fonctionné.

Malheureusement, cette approche n'a pas fonctionné dans Qt5 (j'ai même inclus le dossier des plates-formes avec le fichier qwindows.dll et cela n'a pas fonctionné). Après quelques jours d'essais, j'ai abandonné et compilé une version statique de Qt5.

Encore une fois, cela n'a pas fonctionné. L'application fonctionne sur un PC sur lequel Qt est installé, mais elle se bloque sur des PC "propres". En remarque, les systèmes Windows 8/8.1 ne donnent ni avertissement ni message m'informant du plantage de l'application. Mais dans Windows 7, un message m'informe que l'application s'est bloquée.

J'ai essayé d'exécuter Dependency Walker (depend.exe) et toutes les bibliothèques de la version statique de mon application semblaient bien.

Sous Windows 8, je ne reçois aucune erreur. Mais après avoir profilé l'application dans depend.exe, j'obtiens une violation d'accès provenant de QtGui.dll. L'erreur exacte est

Une exception de deuxième chance 0xC0000005 (violation d'accès) s'est produite dans "QT5GUI.DLL" à l'adresse 0x61C2C000.

Y a-t-il quelque chose qui me manque (dites un extra DLL ou fichier de configuration)?

Informations sur l'application:

  • Écrit et compilé avec Qt 5.2.1
  • Utilise Quick/QML.
  • Utilise le module réseau.
  • Utilise le module webkit.
  • Utilise le module Bluetooth.
  • Les fichiers QML sont écrits en Quick 2.2
33
Alex Spataru

Après quelques heures à creuser dans les forums Qt, j'ai découvert que je devais copier le dossier "qml" (normalement situé dans C: /Qt/5.2.1/qml) dans le répertoire racine de l'application. Après cela, les versions dynamiques et statiques de mon application ont fonctionné sur les systèmes Vanilla.


Répertoire du programme (MinGW 4.8 32 bits, dynamique):

Comme hyde l'a dit, utilisez l'outil windeployqt (<qt path>\<version>\bin\windeployqt.exe) pour copier les fichiers nécessaires dans le dossier de votre application. Après cela, copiez les composants QML requis depuis <qt path>\<version>\qml\ dans le dossier de votre application. Le dossier résultant devrait ressembler à:

  • plateformes (dossier)
  • QtQuick (dossier)
  • QtQuick.2 (dossier)
  • Tous les autres composants QML dont vous avez besoin
  • 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

Répertoire du programme (statique)

Compilez l'application statiquement, puis copiez les composants QML requis depuis <qt path>\<version>\qml\ dans le dossier de votre application. Le dossier résultant devrait ressembler à:

  • QtQuick (dossier)
  • QtQuick.2 (dossier)
  • Tous les autres composants QML dont vous avez besoin
  • app.exe

Je pense que la cause de l'accident était que le Qt5Gui.dll (dynamique et statique) "a essayé" de charger les dossiers QtQuick * pendant l'exécution, mais n'a pas pu les trouver (bloquant ainsi l'application pendant le chargement).

21
Alex Spataru

À partir de Qt 5.2, il existe un outil windeployqt que vous pouvez utiliser. Il suffit de l'exécuter à partir de la ligne de commande pour obtenir de l'aide. Mais l'utilisation de base est, donnez-lui le fichier .exe, il copiera les dépendances Qt pour l'accompagner.

Vous voudrez utiliser --qmldir option pour indiquer à l'outil où se trouvent vos fichiers QML, afin qu'il puisse déterminer les dépendances QML nécessaires.

Remarque sur les tests: pour vous assurer que vous avez tout, testez sur ordinateur sans Qt SDK, ou renommer temporairement le répertoire Qt. Sinon, l'application pourrait trouver des fichiers manquants à partir de là ...

35
hyde