I. L'article original▲
Qt Quarterly est une revue trimestrielle électronique proposée par Nokia à destination des développeurs et utilisateurs de Qt. Vous pouvez trouver les versions originales.
Nokia, Qt, Qt Quarterly et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.
Cet article est la traduction de l'article Deploying Applications on Windows de Andy Shaw paru dans la Qt Quarterly Issue 10.
Cet article est une traduction d'un des tutoriels écrits par Nokia Corporation and/or its subsidiary(-ies) inclus dans la documentation de Qt, en anglais. Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia.
II. Liaison statique▲
Si vous voulez faire simple en ne déployant qu'un seul fichier, c'est à dire un exécutable indépendant, vous devez alors tout compiler de manière statique. Comme pour la liaison statique sur Mac OS X, les avantages sont que l'application se chargera et s'exécutera plus rapidement puisque tous les symboles sont dans l'exécutable. Les inconvénients sont une taille plus grande de celui-ci, et le fait que vous ne pouvez pas utiliser de plugins avec une application liée statiquement.
Avant de pouvoir compiler notre application, nous devons nous assurer que Qt est compilé statiquement. Pour le faire, ouvrez une invite de commandes et tapez les lignes suivantes :
cd
%QTDIR%
con
figure -static <
autres options dont vous avez besoin>
N'oubliez pas de spécifier les autres options dont vous avez besoin, comme le support des threads, en arguments de configure. Une fois que configure a terminé, tapez la commande suivante :
make sub-src
Ceci va compiler Qt de manière statique en mode release. (1) Premièrement nous devons aller dans le répertoire qui contient l'application à déployer.
cd
examples\showimg
Nous devons lancer qmake pour créer un nouveau Makefile pour l'application, et réaliser une compilation propre pour créer un exécutable lié statiquement.
qmake showimg.pro
make clean
make
Maintenant, pourvu que tout ait été compilé et lié sans erreurs, nous devrions avoir un fichier showimg.exe prêt à être déployé. Une méthode simple pour vérifier que l'application peut vraiment s'exécuter de manière indépendante est de la copier sur un ordinateur sans Qt et sans applications Qt d'installées et de l'exécuter.
III. Bibliothèques partagées▲
Si vous ne voulez pas utiliser la compilation statique parce que vous voulez utiliser des plugins ou parce que vous voulez utiliser les mêmes DLL Qt pour une famille d'applications, alors la solution est d'utiliser une bibliothèque partagée.
Comme pour la liaison statique, avant de compiler notre application nous devons nous assurer que Qt est compilé comme une bibliothèque partagée. Pour cela ouvrez une invite de commandes et tapez ce qui suit :
cd
%QTDIR%
con
figure -shared <
autres options dont vous avez besoin>
N'oubliez pas de spécifier les autres options dont vous avez besoin, comme le support des threads, en arguments de configure. Puisque nous utilisons encore l'application showimg comme exemple nous devons aussi spécifier -plugin-imgfmt-jpeg comme option, pour qu'il y ait au moins un plugin. Une fois que configure a terminé, tapez la commande suivante :
make sub-plugins
Cela va compiler Qt en une bibliothèque partagée, en mode release, et compiler le plugin de formatage d'images JPEG. Lorsque Qt a fini de compilé nous pouvons compiler l'application showimg. Premièrement nous devons nous rendre dans le répertoire de l'application à déployer :
cd
..\examples\showimg
Maintenant nous lançons qmake pour créer un nouveau Makefile pour l'application et nous réalisons une compilation propre pour créer l'exécutable lié dynamiquement.
qmake showimg.pro
make clean
make
Si tout a été compilé et lié sans erreurs nous avons un fichier showimg.exe. Pour le déployer nous devons nous assurer de copier la DLL Qt et l'exécutable dans un répertoire approprié (Nous traiterons le cas du plugin JPEG un peu plus loin). Premièrement nous allons vérifier que l'application fonctionnera dans un environnement déployé. Copiez l'exécutable et la DLL Qt sur une machine qui n'a ni Qt, ni d'application Qt installée, ou si vous voulez faire le test sur la machine de compilation, supprimez la variable d'environnement QTDIR et retirez %QTDIR%\bin de la variable d'environnement PATH.
Nous devrions avoir maintenant l'exécutable showimg.exe et la DLL Qt (p.ex. qt331.dll, ou si vous avez configuré le support des threads qt-mt331.dll) dans un répertoire. Dans une invite de commande, rendez vous dans ce répertoire et essayez de lancer le programme.
Si l'application s'exécute sans problèmes alors nous avons réussi à faire une version liée dynamiquement de l'application showimg. Si vous tentez d'ouvrir une image PNG avec l'application, celle-ci devrait être affichée correctement ; mais si vous essayez d'ouvrir une image JPEG, rien ne se passera puisque nous n'avons pas encore déployé le plugin JPEG avec l'application.
IV. Plugins▲
Les plugins fonctionnent différemment des DLLs classiques, nous ne pouvons donc pas simplement les copier dans le même répertoire que notre exécutable comme nous l'avons fait avec la DLL de Qt. Les applications Qt recherchent les plugins dans un sous-répertoire de celui de l'application. Par exemple, un plugin pour un format d'image doit se trouver dans le sous-répertoire imageformats et le plugin d'un pilote SQL doit être dans le sous-répertoire sqldrivers.
Ainsi, pour rendre le plugin JPEG disponible pour notre application showimg, nous avons seulement à nous rendre dans le répertoire de l'application et à copier la DLL appropriée :
mkdir
imageformats
copy
%QTDIR%
\plugins\imageformats\qjpeg100.dll imageformats
(Si vous aviez supprimé la variable d'environnement QTDIR, vous devrez taper le chemin absolu vers le répertoire de Qt au lieu d'utiliser %QTDIR%.) Si vous lancez l'application showimg et ouvrez une image JPEG, celle-ci devrait se charger correctement.
L'un des avantages de l'utilisation des plugins est qu'ils peuvent être facilement mis à la disposition de toute une famille d'applications. Par exemple, si nous avions besoin de plusieurs applications nécessitant le support des images JPEG, il serait plus pratique d'utiliser un répertoire de plugins commun. Nous pourrions alors choisir de placer tous nos plugins dans le répertoire C:\QtPlugins. Si nous utilisons un répertoire personnalisé, nous devons tout de même conserver les sous-répertoires pour les différents types de plugins, notre plugin pour les images JPEG irait donc dans C:\QtPlugins\imageformats. Pour que notre application sache où se trouve ce répertoire de plugins additionnels, nous devons ajouter la ligne suivante, avant que l'application n'ait besoin de charger les plugins.
qApp
->
addLibraryPath("C:
\\
QtPlugins"
);
Il est souvient plus pratique d'ajouter ce chemin à la fonction main() de l'application, juste après la création de l'objet QApplication. Une fois le chemin ajouté, l'application y cherchera les plugins en plus de regarder dans ses propres sous-répertoires. Il est possible d'ajouter autant de chemins que l'on souhaite.
V. Le problème du runtime C▲
Parfois vous devrez distribuer la bibliothèque de runtime C avec votre application. La plupart des versions de Windows ont déjà cette bibliothèque installée, mais si vous utilisez un Visual Studio moderne, ce ne sera peut-être pas le cas. Vous pouvez vérifier à quelles bibliothèques votre application est liée grâce à l'outil depends. Pour vous en servir, vous devez simplement le lancer comme cela :
depends <
exécutable de l'application>
Cela vous donnera une liste des bibliothèques dont votre application dépend ainsi que d'autres informations. Si vous regardez dans la partie en haut à gauche, vous pouvez voir la liste des bibliothèques. Celles que vous voudrez vérifier commencent par MSVC ; pour être certain que vous avez les bonnes bibliothèques disponibles, assurez-vous de copier celles-ci avec votre exécutable.
VI. Conclusion▲
Cet article a couvert les points clés du déploiement d'applications Qt sur Windows. Nous n'avons pas mentionné les versions spécifiques de Windows puisqu'il n'y en avait pas besoin ; les applications Qt compilées sur une version de Windows fonctionneront sur les autres sans modification.
VII. Divers▲
Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à Nokia pour nous avoir autorisé la traduction de cet article !
Ici, j'aimerais adresser un tout grand merci à https://www.developpez.net/forums/u254882/dourouc05/ pour ses corrections et à ram-0000 pour sa relecture !