Notre prochain produit a grandi trop grand pour créer un lien sur une machine à exécuter des fenêtres 32 bits. La somme totale de tous les fichiers LIB dépasse 2 Go et ne peut être liée que sur une machine Windows 64 bits. Finalement, nous dépasserons cette limite, car notre logiciel a tendance à croître plutôt que de contracter et nous utilisons un lieur 32 bits (Mme Visual Studio 2005): nous nous attendons à toucher des problèmes lorsque notre total de la taille de la libération dépasse 3 Go. P>
Comment puis-je réduire la taille des fichiers .lib ou les fichiers .obj sans code de coupe? Par exemple, nous utilisons beaucoup de modèles: y a-t-il un moyen de réduire leur empreinte? Y a-t-il un moyen de découvrir ce qui cause le gonfleur d'examiner les fichiers .Lib / .obj? Cela peut-il être automatisé plutôt que inspecté par les yeux? 2.5 Go est beaucoup de texte à l'égard et à comparer. P>
Les contraintes externes nous empêchent d'expédier comme autre chose qu'une seule .exe, une solution DLL n'est donc pas disponible. P>
8 Réponses :
omfg !!!!! C'est huuuuuge! P>
Outre le fait, je pense que c'est trop gros pour être rationnel ... Impossible d'utiliser une liaison dynamique pour éviter de lier tout le désordre en temps de compilation et uniquement de lien dans l'exécution de ce qui est nécessaire (je veux dire, chargement des DLL à la demande) ? p>
Oui, c'est grand. Nous soupçonnons que nous soupçonnons que le glappage. En particulier, nous soupçonnons que les définitions en ligne des fonctions de modèle de modèle de classe sont répétées avec les mêmes paramètres de modèle de plusieurs fois. Nous voulons vérifier ou réfuter cela, ou entendre toute autre suggestion pour une réduction précoce de la taille .lib.
@hatcat: Je ne pense pas que les membres du modèle inlincé sont le problème. Au contraire, je m'attendrais à ce que les instanciations de modèles non inlinées soient les grands délinquants. Imaginez que vous avez un vecteur
vecteur
Oui, je n'étais pas très clair là-bas. Nous soupçonnons que les échecs en ligne soient la cause et souhaitons réduire ceux, peut-être en spécialisant et en définissant des non-lignes.
J'avais déjà travaillé sur un projet avec plusieurs MLOC. Bien que la nôtre relierait toujours un lien sur une machine 32bits, des temps de liaison où les personnes abyssantes et deviennent un problème majeur, car les développeurs ont été réduits pour obtenir une douzaine de cycles de test de compilation modifiés par jour de travail. (Les temps de compilation ont été très bien manipulés en effectuant une compilation distribuée.) P>
Nous avons changé de liaison dynamique. Cette augmentation du temps de démarrage, mais cela pourrait être géré par le retard de chargement des DLL. p>
J'aimerais faire cela, mais nous devons expédier comme une seule image .exe. Nous développons en tant que lot de DLL, avec une configuration de vente au détail spéciale qui relie de manière statique.
@hatcat: Avez-vous essayé de compiler / lier sans informations de débogage? Ouais, Pita, je sais, mais quelque chose va avoir à donner.
Tout d'abord, bien sûr, assurez-vous de compiler avec l'option "Optimiser la taille". Si vous faites cela, je ne m'attendais pas à l'inliction, au moins, de contribuer de manière significative à la taille du code. Le compilateur fait un compromis pour chaque candidat d'inlinage concernant le montant (si du tout), il augmenterait la taille du code, par rapport au stimulation de la performance, cela donnerait. Et si vous optimisez pour la taille, le compilateur ne risque pas de bloquer beaucoup le code. (Notez que l'amélioration de très petites fonctions peut réellement diminuer la taille du code) p>
Deuxièmement, avez-vous considéré Unity construit ? Cela éliminerait tout à fait la liaison entièrement et avec une seule unité de traduction, il y aurait beaucoup moins de travaux en double et, espérons-le, une empreinte mémoire plus petite. P>
Enfin, je sais que Visual Studio (ou éventuellement le SDK Windows) dispose d'un compilateur 64 bits (c'est-à-dire un compilateur qui est lui-même une application de 64 bits, pas seulement un compilateur produisant du code 64 bits). Envisager d'utiliser cela. (Je ne sais pas s'il y a aussi un lieur de 64 bits) p>
Je ne sais pas que je le linker est construit avec le drapeau Largeaddressaware. Si tel est le cas, le fonctionnement sur une machine de 64 bits permettra au processus de consommer une mémoire complète de 4 Go au lieu des 2 Go qu'elle obtient normalement. (Si nécessaire, vous pouvez ajouter le drapeau vous-même en modifiant l'en-tête PE) P>
Peut-être limiter la liaison de différents symboles pourrait également aider. Si vous savez qu'un symbole ne sera pas nécessaire en dehors de l'unité de traduction actuelle, mettez-la dans un espace de noms anonyme. Cela pourrait permettre au compilateur de réduire les symboles inutilisés avant de tout transmettre à la liaison p>
Merci pour vos suggestions utiles. Persuader le programmateur principal d'éteindre "LTCG" et "Optimiser la vitesse" sont des tâches non triviales. La vitesse est la priorité absolue ici. Nous utilisons des constructions d'unité - nous avons une sélection d'unités de compilation de l'unité afin de faciliter une utilisation efficace de Xoreax Incredibuild (Allez-le). Il y a environ une demi-douzaine d'unités de compilation par bibliothèque. De plus, le compilateur se plaint si vous mettez trop de fichiers source dans une unité de compilation («trop de références» ...?). Enfin, c'est la liaison qui doit être 64 bits. Une telle chose n'existe pas dans l'outil MS Tool.
Fait intéressant, il est intéressant de remplacer «maximiser la vitesse» avec «minimiser la taille» dans les options d'optimisation du plus grand délinquant n'a fait aucune différence pour la taille du tout: elle est restée à 459,205KB (oui, demi-concision). Je suis enclin à croire que la majeure partie du binaire est des informations sur le code plutôt que sur le code lui-même, car elle relie tout en fin de compte à environ 20 Mo.
@hatcat: LTCG? Je suppose que c'est mauvais pour les tailles libérales. "Optimiser la vitesse", OTOH ... J'ai lu quelque part qui, habituellement, «optimiser la taille» apporte plus d'avantages de vitesse, en raison de la plus petite série de travail de l'application. Comme cela était accompagné de l'information que "nous à maps" fais cela (note: je suis pas i> travaillant pour la SP), il a dû être un blog en poste ou un article quelque part dans MSDN. Essayez de trouver cela, cela pourrait persuader votre programmeur principal.
@hatcat: Une dernière chose: êtes-vous par hasard générant des informations de débogage même pour les constructions de libération?
Oh, et I Deuxièmement, la recommandation de Xoreax 'Incredibuild . Excellent outil, excellent support, excellent bang-for-buck. Et non, je ne travaille pas pour eux. Ils méritent juste d'être loués.
@hatcat: persuader le programmateur principal de faire de ces changements devrait être trivial au moment où le linker manque de mémoire. ;) Le logiciel lent est meilleur qu'aucun logiciel. ;) Et comme @sbi dit, "optimiser la vitesse" ne réduit pas nécessairement les performances.
Nous générons effectivement des informations de débogage pour toutes les configurations. Et on dirait que les changements recommandés jusqu'à présent n'ont aucune incidence sur le problème. Je dois cependant obtenir le point d'arrêt LTCG. Vraiment, je veux me concentrer sur la découverte de quels symboles sont définis à plusieurs reprises pour le moment, d'où la question initiale de la fissuration du format de fichier .Lib / .obj.
Ajouté quelques suggestions supplémentaires. Je sais que cela ne vous aide pas à comprendre les informations de symbole de .libs, mais cela pourrait toujours aider.
Vous savez, l'idée d'espace de noms anonyme pourrait être une goeuse. Si, comme nous le croyons, il y a trop de modèles de shenanigans, nous pourrions mettre ces espaces de noms anonymes et préfixer les noms avec l'espace de noms actuel et un soulignement s'il y a des collisions (improbables). Va essayer cela lundi. Merci.
@hatcat: Pas besoin de faire de la tromperie préfixe. Vous pouvez nier des espaces de noms anonymes et nommés, il ne faut donc produire aucune nouvelle collision de noms. Ajoutez simplement l'anonymous à l'intérieur de l'espace de noms le plus profond, par exemple.
Cela doit-il être une grande application? p>
Une option est de diviser divers modules en DLL et de les charger / décharger au besoin. P>
Alternativement, vous pourrez peut-être diviser plusieurs applications et partager des données à l'aide de la mémoire mappée, des tuyaux A DBMS ou même des fichiers de données simples. P>
Il faut effectivement être une grande application.
Eh bien, nous expédons un match avec beaucoup (vraiment lot) de la technologie exclusive. Si nous avons expédié les DLL au fur et à mesure de leur position, cette technologie serait beaucoup plus facile d'inverser l'ingénieur que les interfaces seraient définies. Même si nous avons obscurcissé les identifiants, re folk aurait un début de tête significatif. Ils sont un groupe déterminé et fanatique.
@HATCAT - Un seul exe n'est pas beaucoup i> plus difficile à re mélanger qu'une DLL, à moins que vous n'utilisiez com ou autre chose qui documente auto-documentant. Si vous voulez garder les trucs exclusifs dans un seul exe, vous pouvez décharger des trucs plus banals dans des DLL. Si vous avez besoin de passer des détails sensibles, vous pouvez les chiffrer. Vous pouvez également vérifier la version (et même le hachage) d'une DLL avant de le charger si vous souhaitez empêcher que les personnes remplacent leurs propres DLL (et la DLL puisse faire de même pour l'EXE avant de fonctionner).
Je ne pense pas qu'il y ait un seul outil qui peut vous donner des statistiques que vous souhaitez / besoin. Utilisation des fichiers .map ou de l'utilitaire code> BUTTOLBIN code> avec Si les statistiques confirment votre suspicion de gonflage de gabarit, ou même sans confirmation, cela pourrait être une bonne idée de faire plusieurs choses avec la source: p>
/ symboles code> Le paramètre post-traitement du journal créé peut vous aider à obtenir ce que vous voulez. P>
Tout d'abord, découvrez comment mesurer em> la taille utilisée par diverses fonctionnalités. N'essayez pas d'aller de l'avant et d'essayer de remplacer l'utilisation du modèle ou d'autres choses, car vous soupçonnez qu'il fait une différence significative. exécuter p> pour savoir quelles sections Vos binaires causent la taille énorme. Avez-vous une énorme section de répertoire de débogage? Symboles Strips alors. Le tableau d'adresses d'importation est-il grand? Vérifiez la table et localisez les symboles que vous n'avez pas besoin (un problème avec les modèles est que les symboles d'instanciations de modèle ont tendance à être très très volumineux). L'analyse similiaire peut être effectuée pour le répertoire d'exception, le répertoire du descripteur COM, etc. P> p>
J'aimerais utiliser Butubin, mais je reçois une sortie inattendue. Il suffit de poser une autre question ...
Essayez d'utiliser le Symbole Trier Programme pour vous montrer où se trouvent les morceaux de Bloat dans votre code. Il suffit également de regarder la taille des fichiers bruts .OBJ vous donnera une idée raisonnable de savoir où cible. P>
Ça a l'air très pratique. Je ne suis pas convaincu que cela résoudra notre problème particulier, car je pense que cela est lié à des symboles privés qui sont supprimés au moment de la liaison; Cela dit, je ne suis pas un expert de Dumbin (y arriver) afin que je puisse manquer quelque chose. Néanmoins, j'ajouterai cela à l'armure. Merci pour le pointeur.
Étant donné que votre problème est que les bibliothèques individuelles (pré-lien optimisées) sont très importantes, cela peut vous indiquer dans la direction des classes qui sont les plus ballonnées. Je parierais qu'il y aurait de très grandes classes de modèles instanciées séparément pour différents types. J'ai rencontré des cours comme celui-ci où la plus grande partie de la mise en œuvre pourrait être déplacée dans une fonction d'assistance et que la classe modélise pourrait être réellement légèrement gonflée.
Accessoires à Jalf pour beaucoup d'aide. SymbolSort (et le blog d'accompagnement) est très clair sur cette affaire. Tout ce que je dois faire maintenant, c'est de travailler pourquoi Dumbin me dit que mes fichiers d'objet n'ont pas de symboles. Temps pour une autre question ...
@hatcat et @jalf: il y a en effet un ensemble complet d'outils 64 bits . Par exemple, vous pouvez définir une variable d'environnement:
set PreferredToolArchitecture=x64
Votre programme va devenir plus grand que 9 exabytes ?! :-P
La dynamique est-elle reliant une option?
Non, la liaison est une application 32 bits et s'épuise en dehors de l'espace si la taille du fichier .Lib dépasse l'espace mémoire disponible sur un processus Windows 32 bits, qui est généralement de 2 Go, 3 Go de 3 Go si vous sinonez les paramètres de démarrage. Un énormément de décapage se produit au moment de la liaison qui apporte l'image .exe à une taille beaucoup plus gérable, de l'ordre de 20 Mo. Je veux savoir si nous pouvons faire un décapage avant le lien, c'est-à-dire à la compilation.
La liaison dynamique n'est pas catégoriquement une option. Nous construisons déjà comme ça à des fins de développement, mais nous ne pouvons pas expédier comme ça pour des raisons externes.
Je ne suis pas tout à fait sûr de mes conseils, mais si je me trompe, j'apprécie si j'en parle de ça. Commencez donc par allumer la génération d'un MapFile pour votre projet, puis analyser quelles fonctions ont la plus grande taille et que peut-on faire à ce sujet.
N'y a-t-il pas une liaison de 64 bits disponible? Je sais qu'il y a une version 64 bits du compilateur VC ++, donc je suppose que la même chose était le cas pour la liaison.
Il n'y a pas de lieur 64 bits (à moins que quelqu'un ne puisse me signaler à un?) Je vais essayer l'option MapFile la prochaine fois que je peux accéder à une machine de 64 bits - elle n'est générée qu'après un lien réussi.
À la réflexion, je ne suis pas sûr de quelles informations utiles que le MapFile me le dira. L'EXE lié est inférieur à un centième de la taille des fichiers .lib. Que penses-tu que cela pourrait céder?