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:
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:
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 à:
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 à:
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).
À 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à ...