Question

Je ne mets jamais beaucoup réfléchi à la différence de taille entre une bibliothèque statique et une bibliothèque dynamique des bibliothèques jusqu'à ce que je téléchargé précompilés de boost aujourd'hui. Je trouve que les bibliothèques statiques de boost sont beaucoup plus grandes que les bibliothèques dynamiques.

Par exemple, le débogage bibliothèque multi-thread statique onde boost est 97.7 mb taille alors que la même bibliothèque, mais dynamique, est seulement 1.4 mb taille (y compris la bibliothèque d'importation et dll)! C'est une énorme différence. Pourquoi est-ce?

Deuxième question, si je créer un lien statiquement contre, disons, la bibliothèque wave. Est-ce que cela signifie que mon exécutable ballon en taille à plus de 97.7 mb?

Était-ce utile?

La solution

Les bibliothèques statiques ont les informations complètes de symboles de débogage en eux. Pour que l'information DLLs serait dans les fichiers pdb (que je suppose serait similaire en taille aux libs statiques).

Lorsque vous créez un lien vers la lib statique, les informations de symbole ne sera pas copié dans le .exe - il sera placé dans le fichier pdb (si votre build est configuré pour créer un fichier pdb). Le fichier pdb n'a pas besoin d'être distribué avec le .exe, que ce soit ou non .pdb est créé.

Dans le téléchargement de la bibliothèque préconstruite que je reçois de boostpro.com, je ne reçois pas les fichiers pdb pour les DLL boost qu'ils fournissent. si vous construisez vous-même les DLL, vous aurez probablement obtenir les fichiers pdb (bien que vous pourriez avoir à mettre une option de configuration, pour que je ne sais pas ce que les détails sont).


Mise à jour:

On dirait que je peux me tromper au sujet facilement récupérer des fichiers pdb pour les DLL de boost. De http://comments.gmane.org/gmane.comp.lib. boost.build/23246 :

> Is there an additional option that I can pass on the command line to
> have the (correctly generated) PDB files also copied into the stage
> directory?
     

Pas à ce moment. Vous ne pouvez pirater   tools/build/v2/tools/package.jam à   ajouter <install-type>PDB partout où   <install-type>SHARED_LIB ou   <install-type>STATIC_LIB est maintenant   écrit.

Autres conseils

Non, juste parce que le fichier LIB est une certaine taille, ne signifie pas qu'il va ajouter que la taille de votre EXE. En fait, la plupart des linkers sont assez intelligents pour relier que dans les choses qui est utilisé. Comparez cela à une bibliothèque dynamique, qui doit contenir tout.

Les bibliothèques statiques font sans aucun doute votre plus grand EXE, mais je préfère toujours. Ensuite, je n'ai pas à vous soucier des bibliothèques manquantes ou incompatibles au moment de l'exécution. (Ou au moins, je réduis les chances de cela.)

Étant donné que les bibliothèques statiques ne contiennent pas de données binaires finies, mais les informations nécessaires pour éditeur de liens pour construire binaire, ces informations peuvent être plus grandes que les binaires compilés.

Quand une fonction définie dans le fichier d'en-tête est utilisé dans cpp-fichier, le compilateur met son code (soit inline, ou ajoute simplement) à fichier résultant de l'objet. Cela signifie qu'il y aura beaucoup de doublons. Il est le travail de liaison pour les fusionner, de sorte que la bibliothèque statique attend juste pour linker être réduit:)

En général la taille de l'exécutable est généralement plus avec les bibliothèques statiques, mais la taille de l'exécutable avec les bibliothèques dynamiques est généralement plus petit. DLL et EXE sont liés séparément, de sorte linker ne peut pas savoir quelle fonctionnalité est nécessaire dans la DLL et qui peuvent être jetés. Dans le cas de la bibliothèque statique, éditeur de liens a ces informations et ne peut prendre que ces fichiers OBJ-utilisés.

Le débogage bibliothèque statique contient des informations de débogage, ce qui explique la grande différence de taille.

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