Question

J'ai une bibliothèque statique * .lib créée en utilisant MSVC sur les fenêtres. La taille de la bibliothèque est de dire 70Ko. Ensuite, j'ai une application qui relie cette bibliothèque. Mais maintenant la taille de l'exécutable final (* .exe) est 29KB, inférieure à la bibliothèque. Ce que je veux savoir est:

  1. Depuis la bibliothèque est lié statiquement, je pense qu'il devrait ajouter directement à la taille de l'exécutable et la taille finale exe devrait être plus que cela? Est-ce que les fenêtres format exe font également une compression des données binaires?

  2. Comment est-il pour les systèmes Linux, qui est comment la taille de la bibliothèque sur linux (* .a / *. Fichier la) se rapportent à la taille de l'exécutable linux (* .out)?

-AD

Était-ce utile?

La solution

Il y a des informations de tenue de livres supplémentaires dans le fichier qui n'est pas .lib nécessaire pour l'exécutable final. Cette information aide l'éditeur de liens trouver le code pour lier réellement. En outre, des informations de débogage peuvent être stockées dans le fichier, mais pas dans .exe le fichier <=> (je ne me souviens pas où les informations de débogage est stocké pour obj dans un fichier lib, il pourrait être un autre endroit).

Autres conseils

Une bibliothèque statique sur Windows et Unix est une collection de fichiers .obj / .o. L'éditeur de liens se penche sur chacun de ces fichiers objet et détermine si elle est nécessaire pour que le programme lien. Si ce n'est pas nécessaire, le fichier objet ne sera pas inclus dans l'exécutable final. Cela peut conduire à executables qui sont plus petits, puis la bibliothèque.

EDIT: Comme MSalters souligne, sur Windows, le compilateur VC prend désormais en charge la création de fichiers d'objets qui permettent la liaison au niveau de la fonction, par exemple, voir ici . En fait, modifier-et continuer exige, depuis le montage-et continuer a besoin d'être en mesure de remplacer la plus petite partie possible de l'exécutable.

La bibliothèque statique contient probablement plusieurs fonctions qui ne sont jamais utilisées. Lorsque l'éditeur de liens relie la bibliothèque avec l'exécutable principal, il voit que certaines fonctions ne sont jamais utilisées (et que leurs adresses ne sont jamais prises et stockées dans des pointeurs de fonction), il se contente de jeter le code. Il peut également faire récursive: si la fonction A () est jamais appelé, et A () appelle B (), mais B () est jamais autrement dit, il peut supprimer le code pour A () et B (). Sous Linux, la même chose.

Disclaimer :. Cela fait longtemps que je me suis occupé liaison statique, prenez donc ma réponse avec un grain de sel

Vous avez écrit: Je pensais qu'il devrait ajouter directement à la taille de l'exécutable et la taille finale exe devrait être plus que

?

linkers Naive fonctionnent exactement de cette façon - quand je faisais le développement de passe-temps pour les systèmes CP / M (il y a LONGTEMPS), ce fut un vrai problème.

linkers modernes sont plus intelligents, mais - ils lient seulement dans les fonctions référencées par le code d'origine, ou au besoin

.

En plus des réponses actuelles, l'éditeur de liens est autorisé à supprimer des définitions de fonctions si elles ont un code objet identique -. Cela est destiné à aider à réduire les effets ballonnements de code basé sur un modèle

Une bibliothèque statique doit contenir tous symbole dans son code source, car il peut se relier dans un fichier exécutable qui a juste besoin de ce symbole spécifique. Mais une fois qu'il est lié dans un fichier exécutable, nous savons exactement quels symboles finissent par être utilisés, et ceux qui ne le font pas. Ainsi, l'éditeur de liens peut trivialement supprimer le code utilisé, couper la taille du fichier par un grand nombre. De même, tous les symboles en double (quoi que ce soit qui est défini à la fois la bibliothèque statique et l'exécutable, il est lié en obtient fusionné en une seule instance.

@All: Merci pour les pointeurs. Hewgill @ Greg - Votre réponse a été un bon pointeur. Merci.

La réponse que j'ai découvert était la suivante:

1.) Au cours de la construction Bibliothèque est ce qui se passe si l'option « Conserver débogage programme databse » dans MSVC (ou similaire quelque chose) est activée, alors la bibliothèque aura cette information de débogage ballonnements sa taille.  mais quand je statiquement inclure cette bibliothèque et créer un exécutable, l'éditeur de liens bandes toutes ces informations de débogage de la bibliothèque avant geenrating l'exe et donc la taille exe est inférieure à celle de la bibliothèque.

2.) Quand je désactivé l'option « Conserver debug programme databse », je suis une bibliothèque dont la taille était plus petite que l'exécutable final, ce qui était ce que je pensais est nromal dans la plupart des situations.

-AD

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top