Parlez de la taille du package d'installation du programme Qt et d'un bref guide d'emballage

(Cet article est un article du modérateur de la technologie de programmation KDE et Qt dans la communauté Mizuki. Je pense qu'il a été bien écrit et je l'ai réimprimé. L'adresse d'origine est: http://hgoldfish.com/blogs/article/103/ )

Je vois souvent sur Internet des commentaires selon lesquels le programme Qt est extrêmement volumineux, même par rapport au programme .NET, disant que le programme Qt est fourni avec le package d'installation .NET. Cela a affecté le choix de Qt par de nombreuses personnes. Je pense qu'il est nécessaire de clarifier cela-

De toute évidence, cette affirmation est fausse! !

Il est facile de comprendre que bien que Qt fournisse de nombreux composants, tous les composants ne seront pas utilisés par le programme, et tous les composants ne doivent pas être inclus dans le package d'installation du programme. Prenant Qt 5.7 comme exemple, un programme helloworld.exe qui peut être utilisé normalement n'est pas compressé mais 20 M. En utilisant l'algorithme de compression lzma, le taux de compression est de 25% et la compression n'est que de 6 Mo!

Qu'en est-il des rumeurs sur les centaines de capacité M de Qt?

Cette affaire commence depuis le début.

Qt4.4 a introduit Webkit pour aider les programmeurs à intégrer des pages HTML dans leurs propres programmes. Cela n'avait pas d'importance au début. S'il n'est pas activement inclus dans le projet de toute façon, le package d'installation du programme ne deviendra pas plus grand. A cette époque, le programme Qt n'était que de 8M (compressé à 3M). Dans Qt5, Webkit a été remplacé par Chromium kernel Blink, et le nom a été changé pour QtWebEngine. Les développeurs de Qt ont constaté que l'ICU utilisé par Blink offrait une capacité d'internationalisation plus complète que l'ancienne version de Qt. Par conséquent, il est dit qu'en raison d'un malentendu, les développeurs de Qt ont été contraints de s'appuyer sur ICU dans Qt 5.0. Cette unité de soins intensifs contient une grande quantité de méta-informations internationales, ce qui a soudainement augmenté la capacité de près de 30 millions. .

Une autre raison importante de la croissance facile de Qt est le QML introduit par Qt depuis 4.7. Il s'agit d'un langage modifié basé sur ECMAScript. Depuis lors, le développement Qt a deux écoles, l'une utilise le langage C ++ d'origine pour le développement et l'autre utilise le langage QML pour le développement. Les deux partagent les mêmes fonctionnalités sous-jacentes, telles que diverses structures de données et boucles d'événements QtCore et QtGui avec prise en charge d'OpenGL. Mais au niveau supérieur, Qt fournit QtWidgets pour les développeurs C ++ et fournit QtQuick indépendant pour les développeurs QML.

QtQuick lui-même n'a qu'un langage de mise en page simple, et Qt fournit QtControls sur cette base pour simuler l'apparence des programmes Android, iOS et Windows. Le premier Qt5 n'était pas bien conçu, ce qui a conduit à l'introduction de nombreux composants qui peuvent être utilisés par le programme lors de l'utilisation de QML. Donc un monde hellow descend, c'est assez énorme. Et il est très étrange que si QtWebEngine est utilisé sous la forme de QtWidgets / C ++, presque tous les modules QML seront également introduits. À ce moment, un programme simple atteindra la taille de plus de 100 billions!

Il existe un problème spécial avec la plate-forme Windows. Désormais, l'architecture graphique de Qt appelle OpenGL ES 2.0 pour un rendu de bas niveau, mais Windows nouvellement installé ne prend en charge que OpenGL 1.1. En réponse à ce problème, Qt précoce a fourni deux options pendant la phase de configuration. L'une consiste à utiliser le même ANGLE que Chromium , Traduire les appels OpenGL en appels DirectX. Les deux supposent que le système de l'utilisateur dispose d'un pilote graphique installé et peut prendre en charge OpenGL 2.0. Le premier doit contenir plusieurs DLL ANGLE, augmentant directement la capacité de 17M!

Heureusement, ces choses sont maintenant résolues.

Tout d'abord, la première version de Qt 5 fournissait déjà une option de configuration, vous ne pouvez pas compiler ICU dans Qt, mais la version officielle de téléchargement contient toujours ICU par défaut, et plus tard Qt a directement supprimé la dépendance à ICU. Maintenant, Qt utilisera ICU lorsqu'il trouvera la DLL d'ICU au moment de l'exécution, sinon il appellera l'API du système, et s'il n'est pas disponible, il utilisera simplement l'algorithme intégré de Qt pour gérer l'internationalisation.

Deuxièmement, certaines dépendances étranges de QML sont maintenant supprimées. Donc, que vous utilisiez QtWidgets ou QML, il n'y a qu'environ 20M de capacité lorsqu'il n'est pas compressé.

Dernier point, combien d'ordinateurs d'utilisateurs n'ont pas le pilote graphique installé? Eh bien, il semble qu'il y ait vraiment une machine virtuelle vmware. Mais je pense qu'il suffit d'utiliser directement le pilote OpenGL fourni avec le système. Qt détectera désormais automatiquement l'existence d'ANGLE au moment de l'exécution. S'il existe, utilisez ANGLE. S'il n'existe pas, utilisez le propre OpenGL du système. Vous n'avez pas besoin de le configurer dans l'étape de configuration comme auparavant. De plus, QtWidgets n'utilise pas OpenGL, donc les programmes qui utilisent QtWidgets / C ++ peuvent également supprimer toutes les DLL ANGLE.

Autant dire, comment faire. Très simple: avec Qt 5.7, un programme appelé windeployqt.exe est maintenant fourni, qui se trouve dans le répertoire bin de Qt. Exécutez ce programme, suivi du nom du programme:

  1. Créer un répertoire dist
  2. Copiez le qttest.exe compilé dans le répertoire dist.
  3. Ouvrez cmd.exe, cd dans le répertoire dist
    4.1 Exécutez c: \ qt5 \ bin \ windeployqt.exe qttest.exe
    4.2 Pour le programme QML, vous devez spécifier le répertoire QML: c: \ qt5 \ bin \ windeployqt.exe –qmldir d: \ qttest qttest.exe

À ce stade, vous verrez que qt a copié toutes les DLL dont il a besoin. Sur cette base, je supprimerai certains éléments au besoin:

  1. libEGL.dll, libGLESV2.dll Ces deux fichiers sont des fichiers ANGLE et peuvent être supprimés. opengl32sw.dll est une émulation logicielle d'OpenGL, sauf si le système de l'utilisateur ne prend même pas en charge DirectX - c'est le cas avec l'environnement de la machine virtuelle - sinon ce fichier est complètement inutile. Les programmes QtWidgets / C ++ n'utilisent pas OpenGL, il suffit donc de les supprimer. Vous pouvez ajouter "–no-angle" et "–no-opengl-sw" lors de l'appel de windeployqt.exe.
  2. Si svg n'est pas utilisé, les trois fichiers iconengines \ qsvgicon.dll, imageformats \ qsvg.dll, Qt5Svg.dll peuvent également être supprimés
  3. S'il n'y a pas d'utilisateurs internationaux, les fichiers de traduction dans les traductions peuvent également être supprimés.
  4. QtWidgets / C ++ n'est pas utilisé dans les programmes QML, vous pouvez supprimer Qt5Widgets.dll
  5. S'il existe plusieurs formats d'image dans le répertoire imageformats qui ne sont pas utilisés, ils peuvent également être supprimés. Je supprime généralement le répertoire entier moi-même. Qt a compilé le support png. Il suffit de lire et d'écrire les icônes contenues dans le programme. Les autres formats ne sont pas importants.
  6. qmltooling et Qt5Network.dll sont utilisés pour le débogage QML et peuvent être supprimés.

Après le recadrage ci-dessus, après avoir utilisé 7zip pour compresser, un programme helloworld QtWidgets / C ++ n'a finalement que 5,64 M, un programme QtControls est 5,86 M et le programme QtQuick sera plus petit.

Remarque:

Au moment d'écrire ces lignes, Qt 5.8 a été publié. Dans cette version, il ne dépend plus d'OpenGL ES 2.0, mais contourne ANGLE et appelle directement le rendu DirectX. Pour Qt 5.10, il prend également directement en charge l'API Vulkan. Cependant, il est encore expérimental à l'heure actuelle, si vous êtes intéressé, vous pouvez consulter la description de configure.

Le nouveau Qt 5.8 réécrit le système de configuration pour réduire Qt plus profondément. Un minimum de 5M non compressés peut déployer un programme QML.

Matériaux de référence:

  1. ICU Qt 5
    https://wiki.qt.io/Qt_5_ICU
    http://wiki.qt.io/Qt-5-QLocale

  2. Chargement dynamique des pilotes graphiques
    http://doc.qt.io/qt-5/windows-requirements.html

  3. Qt Lite
    http://blog.qt.io/blog/2017/01/23/qt-5-8-released/

L'article d'origine sans "réimpression" dans le titre est protégé par le droit d'auteur. Veuillez indiquer la source de la réimpression: http://hgoldfish.com/blogs/article/103/ .

 
Publié 315 articles originaux · loué 937 · 650 000 vues

Je suppose que tu aimes

Origine blog.csdn.net/super828/article/details/78848681
conseillé
Classement