Différence entre les bibliothèques statiques et partagées?
Quelle est la différence entre les bibliothèques statiques et partagées?
J'utilise Eclipse et il y a plusieurs types de projets, y compris les Bibliothèques Statiques et les Bibliothèques Partagées? A-t-on un avantage sur les autres?
Wikipédia a un description de la distinction entre statique, dynamique et de bibliothèques partagées.
OriginalL'auteur Mohit Deshpande | 2010-04-15
Vous devez vous connecter pour publier un commentaire.
Les bibliothèques partagées sont .(ou dans Windows .dll, ou OS X .dylib) des fichiers. Tout le code concernant la bibliothèque est dans ce fichier, et il est référencé par les programmes de l'utiliser au moment de l'exécution. Un programme à l'aide d'une bibliothèque partagée ne fait référence au code qu'il utilise dans la bibliothèque partagée.
Bibliothèques statiques sont .une (ou dans Windows .lib) des fichiers. Tout le code concernant la bibliothèque est dans ce fichier, et il est relié directement dans le programme au moment de la compilation. Un programme à l'aide d'une bibliothèque statique prend des copies du code qu'il utilise à partir de la bibliothèque statique et fait partie du programme. [Windows a aussi .lib fichiers qui sont utilisés à titre de référence .les fichiers dll, mais ils agissent de la même manière que la première].
Il y a des avantages et des inconvénients de chaque méthode.
Bibliothèques partagées de réduire la quantité de code est dupliqué dans chaque programme qui rend l'utilisation de la bibliothèque, en gardant les fichiers binaires petit. Il vous permet également de remplacer l'objet partagé avec celui qui est fonctionnellement équivalent, mais peut-être ajouté des avantages de performance sans avoir besoin de recompiler le programme qui l'utilise. Bibliothèques partagées sera, cependant, ont un faible coût supplémentaire pour l'exécution des fonctions ainsi qu'un temps de chargement de coût comme tous les symboles dans la bibliothèque besoin d'être connecté à des choses qu'ils utilisent. En outre, les bibliothèques partagées peuvent être chargées dans une application au moment de l'exécution, qui est le mécanisme général pour la mise en œuvre binaire plug-in de systèmes.
Bibliothèques statiques augmentation de la taille globale de la binaire, mais cela signifie que vous n'avez pas besoin de transporter le long d'une copie de la bibliothèque qui est utilisé. Comme le code est connecté au moment de la compilation il n'y a pas tout supplémentaire au moment de l'exécution des frais de chargement. Le code est là, simplement.
Personnellement, je préfère les bibliothèques partagées, mais l'utilisation de bibliothèques statiques en avoir besoin pour s'assurer que le binaire n'a pas beaucoup de dépendances externes qui peuvent être difficile à atteindre, telles que des versions spécifiques de la norme C++ de la bibliothèque ou des versions spécifiques de l'Boost C++ de la bibliothèque.
"[.sos engager un] petit coût supplémentaire pour l'exécution des fonctions" - c'est possible (si la fonction des groupes de commandes ont été optimisés pour la localité de cache dans le lien statique, ou en raison de bizarreries dans OS/chargeur/compilateur/architecture comme la croix-segment/grand-pointeur de perf. les sanctions), mais sur de nombreuses architectures/compilateur-paramètres de l'éditeur de liens dynamique des correctifs à l'appel pour créer exactement le même appel de la machine opcodes.
"Comme le code est connecté au moment de la compilation il n'y a pas tout supplémentaire au moment de l'exécution des frais de chargement. Le code est là, simplement." - oui et non... tout est dans l'image exécutable prêts à être envoyés si l'exécution l'exige, mais à partir d'une situation où votre programme n'a pas exécuté récemment assez pour être dans le cache - avec les bibliothèques partagées, il est possible (parfois probable ou certain) que les OS, un pilote ou un autre programme en cours d'exécution ont déjà chargés de la même partagée de la bibliothèque de votre application souhaite utiliser, dans ce cas, il peut être dans le cache et votre programme de début et de courir plus vite.
Ce que certaines personnes ont omis de mentionner, c'est qu'avec les bibliothèques statiques le compilateur connaît les fonctions de votre application à vos besoins et vous pouvez ensuite l'optimiser en tenant seulement compte de ces fonctions. Cela peut réduire vers le bas sur la taille de la librairie massivement, surtout si vous utilisez uniquement un très petit sous-ensemble d'une très grande bibliothèque!
Cette réponse pourrait être mieux organisé. Il serait utile de faire des listes à puces pour les pros/cons ou un tableau pour montrer les différences dans chaque dimension, où il y a une différence.
OriginalL'auteur Petesh
Une bibliothèque statique est comme dans une librairie et une bibliothèque partagée est comme... une bibliothèque. Avec l'ancien, vous obtenez votre propre copie du livre/de la fonction à la maison; avec ce dernier, vous et tout le monde d'aller à la bibliothèque pour utiliser le même livre/fonction. Donc, toute personne qui veut utiliser l' (partagé) de la bibliothèque a besoin de savoir où il est, parce que vous avez à "aller chercher" le livre/la fonction. Avec une bibliothèque statique, le livre/la fonction est à votre propre, et vous garder à l'intérieur de votre maison/programme, et une fois que vous l'avez vous n'avez pas de soins où et quand vous l'avez obtenu.
OriginalL'auteur Paul Richter
Simplifiée:
OriginalL'auteur StackedCrooked
Pour une bibliothèque statique, le code est extrait à partir de la bibliothèque par l'éditeur de liens et utilisé pour construire l'exécutable final au moment de la compilation/construire votre application. L'exécutable final n'a pas de dépendances sur la bibliothèque au moment de l'exécution
Pour une bibliothèque partagée, le compilateur/linker vérifie que les noms que vous lier avec d'exister dans la bibliothèque lorsque l'application est construite, mais ne bouge pas leur code dans l'application. Au moment de l'exécution, la bibliothèque partagée doit être disponible.
Le langage de programmation C lui-même n'a pas de notion de statique ou de bibliothèques partagées, ils sont complètement de mise en œuvre de la fonctionnalité.
Personnellement, je préfère utiliser les bibliothèques statiques, car il rend le logiciel de distribution de plus simple. Cependant, c'est une opinion sur le bien (figurative) de sang a été versé dans le passé.
OriginalL'auteur
Bibliothèques statiques sont compilés dans le cadre d'une application, alors que les bibliothèques partagées sont pas. Lorsque vous distribuez une application qui repose sur le partage de la libaries, les bibliothèques, par exemple. dll sur MS Windows doivent être installés.
L'avantage des bibliothèques statiques, c'est que il n'y a pas de dépendances requises pour l'utilisateur exécutant l'application - par exemple, ils n'ont pas de mise à niveau de leurs DLL de quoi que ce soit. L'inconvénient est que votre demande est de plus grande taille, parce que vous l'expédition avec toutes les bibliothèques dont il a besoin.
Ainsi que par les grands pour les petites applications, bibliothèques partagées offrir à l'utilisateur la possibilité d'utiliser leur propre, peut-être une meilleure version de la bibliothèque plutôt que de compter sur une partie de la demande
"Les bibliothèques statiques sont compilés dans le cadre d'une demande" ... les bibliothèques statiques sont compilés en tant que bibliothèques statiques et liée dans le cadre d'une demande
OriginalL'auteur Tarski
L'avantage le plus significatif de bibliothèques partagées est qu'il n'existe qu'une seule copie de code chargé en mémoire, peu importe le nombre de processus à l'aide de la bibliothèque. Pour les bibliothèques statiques chaque processus a sa propre copie du code. Cela peut entraîner une importante mémoire gaspillage.
Otoh, que, d'un avantage de bibliothèques statiques, c'est que tout est regroupé dans votre application. Si vous n'avez pas à vous inquiéter que le client aura le droit de la bibliothèque (et version) disponible sur leur système.
C'est exact, c'est ce que je faisait allusion quand j'ai dit que tout est regroupé dans votre application.
En outre,
.so
fichiers sur les systèmes *nix sont un peu partagés(dynamique) de la bibliothèque.OriginalL'auteur Jasmeet
Au-dessus de toutes les autres réponses, une chose n'a pas mentionné encore est le découplage :
Permettez-moi de parler d'un monde réel de la production de code,que j'ai eu affaire avec :
Un très gros logiciels, composée de >300 projets (avec visual studio), construit essentiellement statique lib et enfin toutes les lier ensemble dans une grande exécutable , vous vous retrouvez avec les problèmes suivants :
-Lien de temps est très long. Vous pourriez finir par plus de 15min de lien, pour disons 10s le temps de compilation
-Certains outils sont sur leur genou avec un gros exécutable , comme la mémoire des outils qui doivent instrument le code. Vous pourriez tomber en atteindre les limites qui avaient été perçus comme des imbéciles.
Plus problématique est le découplage de votre logiciel : sur cet exemple réel, les en-têtes de fichiers de chaque projet ont été reacheable de tous les autres projets. En conséquence, il est extrêmement facile pour un développeur d'ajouter des dépendances; il était juste sur le fait d'inclure l'en-tête, parce que le lien à la fin sera allwaws trouver des symboles. Il finit par horrible vélo dépendances et désordre complet.
Avec la bibliothèque partagée, c'est un peu de travail supplémentaire parce que le développeur doit modifier le projet de construction du système d'ajouter la personne à charge de la bibliothèque. J'ai observé que la bibliothèque partagée code tend à offrir un produit de nettoyage de code API.
OriginalL'auteur sandwood
OriginalL'auteur snr