Dois-je inclure toutes ces DLL Qt avec mon application?
Je suis totalement nouveau dans l'utilisation de Qt et je ne sais pas beaucoup de choses.
En tant que test, j'ai créé une application simple en utilisant Visual Studio 2012 {[6] } et Qt-VS-Add-in basé sur le plus récent Qt5.1
Après avoir compilé l'application, cela n'a pas fonctionné pour moi (a donné des erreurs), j'ai cherché partout sur internet et trouvé beaucoup de gens disant que je devais copier ces DLL mentionnées ci-dessous à partir du répertoire:
C:QtQt5.1.05.1.0msvc2012bin
DLL que j'ai dû Copier pour faire ma demande travail:
icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
Mon problème est la taille de ces DLL, elles sont à propos de " 37 MB "et mon application elle-même n'est que"30 KB"! Ainsi, ces bibliothèques Qt ajouteront au moins 37 Mo à mon application [ ce que je ne vois pas arriver avec d'autres applications basées sur Qt que je télécharge ]. Y at-il une solution peut me faire finir avec un seul petit.fichier exe?!
Et j'ai entendu certaines personnes dire que je dois également inclure une dll pour le compilateur Microsoft C++, pouvez-vous expliquer cela pour moi?
Note: j'ai rencontré beaucoup de questions ici sur StackOverFlow mais je n'ai rien trouvé qui puisse m'aider, alors ne signalez pas cela comme une duplication car si je trouvais une réponse claire, Je ne posterais pas cette question!
Toute aide serait appréciée.
6 réponses
Mise à jour: Utiliser windeployqt.exe
! Il fonctionne vraiment bien.
Http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool
La façon La plus simple d'utiliser windeployqt est d'ajouter le répertoire bin de votre installation Qt (par exemple ) à la variable PATH, puis exécuter:
windeployqt <path-to-app-binary>
UPDATE: lors de tests supplémentaires, windeployqt
n'a pas copié sur toutes les DLL MingW pour moi. (Testé avec Qt 5.4 sur Windows 10 avec MingW 4.9.1). Donc, vous devez obtenir manuellement le 3 dernières DLL avant le déploiement:
libgcc_s_dw2-1.dll
libstdc++-6.dll
libwinpthread-1.dll
De
C:\Qt\5.4\mingw491_32\bin
Je pense que vous avez peut-être quelques extras dans votre liste... Je vérifierais les documents dans les liens ci-dessous...
Voici la documentation définitive à ce sujet:
Http://doc.qt.io/qt-5/windows-deployment.html
Http://doc.qt.io/qt-5/windows-deployment.html#application-dependencies
Taille des dll Qt
Les étonnantes bibliothèques Qt peuvent faire beaucoup, mais elles le sont sorte de gros. Certaines des anciennes versions de Qt pourraient être un peu plus petites.
Pour Qt 4.8 msvc QtCore4.dll
est 2.5 MB, et QtGui4.dll
est 8.4 MB.
Comment Windows résout les bibliothèques partagées / bibliothèques de liens dynamiques (DLL)
Voici comment Windows suit une bibliothèque à l'exécution:
Http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs. 85).aspx
Unique petit EXE
Si vous liez statiquement, alors votre EXE devrait saisir les bibliothèques besoins et se construit dans un seul fichier exe. Il peut encore dépendre des redistribuables msvc. Voir la section suivante pour plus d'informations à ce sujet. Mais il compile maintenant les .lib
que vous référencez dans votre EXE et votre exe ne pointe plus vers d'autres bibliothèques liées dynamiquement. Cela prend plus de temps pour obtenir la configuration de votre environnement exe lié statiquement.
Votre exe deviendra certainement plus grand car il inclut maintenant les informations binaires pour les bibliothèques que vous avez référencées avant.
Https://www.google.com/search?q=qt+statique+liaison
Modifier:
Construire statiquement l'exe, signifie que vous n'utilisez pas la version LGPL.
signifie que vous devez avoir vos fichiers objet faciles d'accès aux utilisateurs finaux si vous utilisez LGPL.
Je pense que @peppe l'a bien décrit (voir commentaire ci-dessous):
Techniquement, vous êtes autorisé à lier statiquement lorsque vous utilisez Qt sous LGPL, même si votre application n'utilise pas LGPL. La seule l'exigence délicate est de garder la possibilité pour un tiers de relier votre application à une version différente de Qt. Mais vous pouvez vous y conformer facilement, F. I. en fournissant un énorme fichier objet (.o) de votre application, qui ne doit être liée à aucune version Qt.
Http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/
Regardez le graphique près du bas. Si vous faites la version commerciale, alors vous pouvez lier statiquement, sans se soucier des fichiers objet.
MSVC Transmissibles
Les dépendances redistribuables ont à voir avec les options de l'éditeur de liens de bibliothèque d'exécution.
Http://msdn.microsoft.com/en-us/library/aa278396(v=vs. 60).aspx
/MD, /ML, /MT, /LD
(Utiliser La Bibliothèque D'Exécution)
Pour trouver ces options dans l'environnement de développement, cliquez sur Paramètres dans le menu Projet. Cliquez ensuite sur L'onglet C/C++, puis sur génération de Code dans la zone Catégorie. Voir à l'Utilisation Boîte déroulante Bibliothèque d'exécution.
Ces deux liens ci-dessous parlent de certaines anciennes versions de visual studio, mais le raisonnement devrait toujours tenir.
Http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
Comment puis-je faire un lien entièrement statiquement .exe avec Visual Studio Express 2005?
J'espère que ça aide.
Ouvrez simplement votre terminal execute your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe
. Il copiera automatiquement toutes les libs et autres choses nécessaires dans le dossier, où se trouve votre exe et vous pouvez simplement le distribuer.
Pour Windows, vous devez inclure qminimal.dll
et qwindows.dll
, vous devrez les mettre dans le dossier appelé platforms
.
Même si votre programme est petit, vous appelez toujours d'énormes bibliothèques pour faire l'interface graphique. Si la taille est vraiment importante, vous devriez faire un projet de console.
PS: Vous pouvez vérifier toutes les bibliothèques dont vous avez vraiment besoin en ouvrant votre exe avec le dependency walker .
J'ai trouvé une autre solution de contournement sans recompiler Qt à nouveau!
[ Cette solution peut affecter le temps d'exécution de l'application]
- Nous devons D'abord utiliser UPX pour compresser chacune des bibliothèques Qt requises par notre application, elles sont souvent les dll mentionnées dans la question. Cependant, évitez de les compresser trop car vous remarquerez que votre application prend plus de temps à s'exécuter.
- [facultatif]: si le binaire de votre application est volumineux, il peut être utile de compressez-le en utilisant UPX.
-
Après avoir compressé tous les binaires, nous voulons en obtenir un seul .fichier exe, donc nous pouvons utiliser
Boîte virtuelle Enigma [ http://enigmaprotector.com/en/downloads.html ] pour tout fusionner .les fichiers dll avec l'exécutable principal et nous finirons avec un tout petit .fichier exe!
Je vais juste le faire comme ça pour l'instant puisque je ne suis pas capable de recompiler Qt avec mes propres configurations sur ma machine actuelle.
Il me semble que Qt5. 2 nécessite moins de dll.
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
Dans windows, vous avez également besoin de " qwindows.dll" dans le dossier "plates-formes". lui donner un essai.
Une possibilité de réduire la taille des dll est de les compresser avec UPX comme mentionné par Alaa Alrufaie. Une autre méthode consiste à l'envelopper dans un programme d'installation (par exemple Inno Setup). Le dernier est particulièrement utile si vous souhaitez le distribuer aux utilisateurs finaux). J'avais une application simple nécessitant Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll et qwindows.dll (dans le dossier "plates-formes") prenant environ 17 Mo. Après avoir créé un fichier d'installation, il a diminué à 5 Mo.