web-dev-qa-db-fra.com

Dois-je inclure toutes ces dll Qt dans mon application?

Je suis totalement nouveau dans l'utilisation de Qt et je ne connais pas beaucoup de choses.

En guise de test, j'ai créé une application simple utilisant Visual Studio 2012 et Qt-VS-Add-in, basée sur le dernier/ Qt5.1

Après avoir compilé l'application, cela ne fonctionnait pas pour moi (donnait des erreurs), j'ai cherché sur Internet et trouvé beaucoup de personnes qui disaient que je devais copier les dll mentionnées ci-dessous à partir du répertoire:

C:\Qt\Qt5.1.0\5.1.0\msvc2012\bin\

Les DLL que j'ai dû copier pour que mon application fonctionne:

icudt51.dll
icuin51.dll
icuuc51.dll
libEGL.dll
libGLESv2.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll

Mon problème est la taille de ces dlls, ils sont sur "37 Mo" et mon application elle-même est seulement "30 Ko"! Ainsi, ces bibliothèques Qt ajouteront au moins 37 Mo à mon application [ce que je ne vois pas cela se produit avec les autres applications Qt que je télécharge]. Existe-t-il une solution qui puisse me faire me retrouver avec un seul petit fichier .exe?!


Et j'ai entendu certaines personnes dire que je devais également inclure une DLL pour le compilateur Microsoft C++, pouvez-vous m'expliquer cela?


Remarque: J'ai rencontré beaucoup de questions ici sur StackOverFlow mais je ne pouvais rien trouver qui puisse m'aider. Veuillez donc ne pas le signaler comme une duplication, car si je trouvais une réponse claire, je ne posterais pas cette question!


Toute aide serait appréciée.

29
Alaa Salah

UPDATE: Utilisez windeployqt.exe! Ça marche vraiment bien.

http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool

Le moyen le plus simple d'utiliser windeployqt est d'ajouter le répertoire bin de votre installation de Qt (par exemple) avec la variable PATH, puis courir:

windeployqt <path-to-app-binary>

MISE À JOUR: Lors de tests supplémentaires, windeployqt n'a pas copié toutes les dll MingW pour moi. (Testé avec Qt 5.4 sur Windows 10 avec MingW 4.9.1). Donc, vous devez récupérer manuellement les 3 dernières dll avant de déployer:

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 revérifierais la documentation 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 sont un peu grandes. Certaines des anciennes versions de Qt pourraient être un peu plus petites.

Pour Qt 4.8, msvc QtCore4.dll correspond à 2,5 Mo et QtGui4.dll à 8,4 MB.

Résolution des bibliothèques partagées/bibliothèques de liens dynamiques (DLL) par Windows

Voici comment Windows recherche une bibliothèque au moment de l'exécution:

http://msdn.Microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx

Seul petit EXE

Si vous établissez un lien statique, alors votre fichier EXE devrait récupérer les bibliothèques dont il a besoin et être intégré à un fichier exe autonome. Il peut toujours dépendre de msvc redistributables. Voir la section suivante pour plus d'informations à ce sujet. Mais il compile maintenant le .libs que vous référencez dans votre fichier EXE et votre fichier 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 grossira certainement car il inclut maintenant les informations binaires des bibliothèques que vous avez déjà mentionnées.

https://www.google.com/search?q=qt+static+linking

EDIT: Construire statiquement l'exe, signifie que vous n'utilisez pas la version LGPL.Si vous utilisez LGPL, vous devez pouvoir accéder facilement à vos fichiers d’objets pour les utilisateurs finaux.

Je pense que @peppe l'a bien décrit (voir le commentaire ci-dessous):

Techniquement, vous êtes autorisé à créer un lien statique lorsque vous utilisez Qt sous LGPL, même si votre application n'utilise pas LGPL. La seule condition délicate est de garder la possibilité pour un tiers de relier votre application à une autre version de Qt. Mais vous pouvez vous y conformer facilement, par exemple. en fournissant un énorme fichier objet (.o) de votre application, qui ne doit être lié à aucune version de Qt.

http://blog.qt.io/blog/2009/11/30/qt-making-the-right-licensing-decision/

Regardez le tableau vers le bas. Si vous utilisez la version commerciale, vous pouvez alors créer un lien statique sans vous soucier des fichiers objets.

Redistribuables MSVC

Les dépendances redistribuables ont à voir avec les options de l'éditeur de liens de la 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 rechercher 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 la liste déroulante Utiliser la bibliothèque d'exécution.

Ces deux liens ci-dessous traitent d'anciennes versions de Visual Studio, mais le raisonnement devrait rester le même.

http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Comment créer un fichier .exe lié statiquement avec Visual Studio Express 2005?

J'espère que cela pourra aider.

25
phyatt

Ouvrez simplement votre terminal, exécutez your_qt_installpath/version/compiler/bin/windeployqt.exe YourApplication.exe. Il copiera automatiquement toutes les bibliothèques et tous les éléments requis dans le dossier où se trouve votre fichier .exe et vous pouvez simplement le distribuer.

7
Niklas

Une possibilité pour réduire la taille des DLL consiste à 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). Ce 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 été réduit à 5 Mo.

1
Zoltán Csáti

Pour Windows, vous devez inclure qminimal.dll et qwindows.dll, vous devrez les placer dans un 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 réellement besoin en ouvrant votre fichier exe avec le dependency walker .

1
R.Falque

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" . essayez-le.

1
Fay100

J'ai trouvé une autre solution de contournement sans recompiler Qt!

[Cette solution peut affecter le temps d'exécution de l'application]

  • Tout d’abord, nous devons utiliser UPX pour compresser chacune des bibliothèques Qt requises par notre application. C’est souvent la dll qui est mentionnée dans la question. Cependant, évitez de trop les compresser, car vous remarquerez que l'exécution de votre application prend plus de temps.
  • [Facultatif]: Si le fichier binaire de votre application est volumineux, il peut s'avérer utile de le compresser à l'aide de UPX.
  • Après avoir compressé tous les fichiers binaires, nous voulons obtenir un seul fichier .exe afin de pouvoir utiliser

    Enigma Virtual Box [ http://enigmaprotector.com/en/downloads.html ] pour fusionner tous les fichiers .dll avec l'exécutable principal et vous obtiendrez un seul fichier .exe!

Je vais simplement le faire comme ceci pour le moment car je ne suis pas en mesure de recompiler Qt avec mes propres configurations sur ma machine actuelle.

1
Alaa Salah