Question 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 existe plusieurs types de projets, y compris les bibliothèques statiques et les bibliothèques partagées? A-t-on un avantage sur l'autre?


455
2018-04-15 22:08


origine


Réponses:


Les bibliothèques partagées sont .so (ou dans Windows .dll ou dans OS X .dylib). Tout le code relatif à la bibliothèque est dans ce fichier, et il est référencé par les programmes qui l'utilisent au moment de l'exécution. Un programme utilisant une bibliothèque partagée fait seulement référence au code qu'il utilise dans la bibliothèque partagée.

Les bibliothèques statiques sont .a (ou dans les fichiers Windows .lib). Tout le code relatif à la bibliothèque est dans ce fichier, et il est directement lié au programme au moment de la compilation. Un programme utilisant une bibliothèque statique prend des copies du code qu'il utilise dans la bibliothèque statique et l'intègre au programme. [Windows a également des fichiers .lib qui sont utilisés pour référencer les fichiers .dll, mais ils agissent de la même manière que le premier].

Il y a des avantages et des inconvénients dans chaque méthode.

Les bibliothèques partagées réduisent la quantité de code dupliquée dans chaque programme qui utilise la bibliothèque, ce qui réduit les binaires. Il vous permet également de remplacer l'objet partagé par un autre qui est fonctionnellement équivalent, mais peut avoir ajouté des avantages de performance sans avoir besoin de recompiler le programme qui l'utilise. Les bibliothèques partagées auront cependant un petit coût supplémentaire pour l'exécution des fonctions ainsi qu'un coût de chargement au moment de l'exécution car tous les symboles de la bibliothèque doivent être connectés aux choses qu'ils utilisent. De plus, les bibliothèques partagées peuvent être chargées dans une application lors de l'exécution, ce qui constitue le mécanisme général d'implémentation des systèmes de plug-in binaires.

Les bibliothèques statiques augmentent la taille globale du fichier binaire, mais cela signifie que vous n'avez pas besoin d'emporter une copie de la bibliothèque en cours d'utilisation. Comme le code est connecté au moment de la compilation, il n'y a pas de coûts de chargement supplémentaires. Le code est simplement là.

Personnellement, je préfère les bibliothèques partagées, mais j'utilise des bibliothèques statiques pour vérifier que le binaire n'a pas beaucoup de dépendances externes qui peuvent être difficiles à satisfaire, telles que des versions spécifiques de la bibliothèque standard C ++ ou des versions spécifiques de la bibliothèque Boost C ++.


636
2018-04-15 22:29



Une bibliothèque statique est comme une librairie, et une bibliothèque partagée est comme ... une bibliothèque. Avec le premier, vous obtenez votre propre copie du livre / fonction à ramener à la maison; avec ce dernier vous et tout le monde vont à la bibliothèque pour utiliser le même livre / fonction. Donc, toute personne qui veut utiliser la bibliothèque (partagée) doit savoir où elle se trouve, parce que vous devez "aller chercher" le livre / la fonction. Avec une bibliothèque statique, le livre / la fonction est à vous, et vous le gardez dans votre maison / programme, et une fois que vous l'avez vous ne vous souciez pas où et quand vous l'avez.


338
2018-04-16 01:36



Simplifié:

  • Liaison statique: un grand exécutable
  • Liaison dynamique: un petit exécutable plus un ou plusieurs fichiers de bibliothèque (fichiers .dll sous Windows, .so sous Linux ou .dylib sur macOS)

50
2018-04-15 22:16



Les bibliothèques statiques sont compilées dans le cadre d'une application, contrairement aux bibliothèques partagées. Lorsque vous distribuez une application qui dépend des bibliothèques partagées, les bibliothèques, par exemple. Les fichiers dll sur MS Windows doivent être installés.

Les avantages des bibliothèques statiques sont qu’il n’ya pas de dépendances requises pour l’utilisateur exécutant l’application - par ex. ils n'ont pas à mettre à jour leur DLL de tout ... Les inconvénients sont que votre application est plus grande en taille parce que vous l'expédiez avec toutes les bibliothèques dont elle a besoin.

En plus de créer des applications plus petites, les bibliothèques partagées permettent à l’utilisateur d’utiliser leur propre version, peut-être meilleure, des bibliothèques plutôt que de s’appuyer sur celle qui fait partie de l’application.


28
2018-04-15 22:17



Pour une bibliothèque statique, le code est extrait de la bibliothèque par l'éditeur de liens et utilisé pour générer l'exécutable final au moment où vous compilez / construisez votre application. L'exécutable final n'a aucune dépendance sur la bibliothèque au moment de l'exécution

Pour une bibliothèque partagée, le compilateur / éditeur de liens vérifie que les noms avec lesquels vous liez existent dans la bibliothèque lors de la construction de l'application, mais ne déplace 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 aucun concept de bibliothèques statiques ou partagées - elles constituent une fonctionnalité d’implémentation.

Personnellement, je préfère utiliser des bibliothèques statiques, car cela simplifie la distribution de logiciels. Cependant, c'est une opinion sur laquelle beaucoup de sang (figuratif) a été versé dans le passé.


25
2018-04-15 22:13



L'avantage le plus important des bibliothèques partagées est qu'il n'y a qu'une seule copie de code chargée en mémoire, quel que soit le nombre de processus utilisant la bibliothèque. Pour les bibliothèques statiques, chaque processus obtient sa propre copie du code. Cela peut entraîner un gaspillage important de mémoire.

OTOH, un avantage des bibliothèques statiques est que tout est regroupé dans votre application. Vous n'avez donc pas à craindre que le client dispose de la bonne bibliothèque (et de la version) disponible sur son système.


15
2018-04-15 22:15



En plus de toutes les autres réponses, une chose qui n'est pas encore mentionnée est le découplage:

Permettez-moi de parler d’un code de production du monde réel, avec lequel j’ai eu affaire:

Un très gros logiciel, composé de plus de 300 projets (avec Visual Studio), la plupart du temps construits en librairie statique et enfin tous liés dans un énorme exécutable, vous vous retrouvez avec les problèmes suivants:

Le temps de liaison est extrêmement long. Vous pourriez vous retrouver avec plus de 15min de lien, disons 10s de temps de compilation -Quelques outils sont à genoux avec un si grand exécutable, comme les outils de vérification de la mémoire qui doivent instrumenter le code. Vous pourriez tomber dans des limites qui ont été considérées comme des imbéciles.

Plus déconcertant est le découplage de votre logiciel: sur cet exemple du monde réel, les fichiers d'en-têtes de chaque projet étaient accessibles à partir de tous les autres projets. En conséquence, il était extrêmement facile pour un développeur d’ajouter des dépendances; il s'agissait juste d'inclure l'en-tête, car le lien à la fin allwaws trouverait des symboles. Il se termine par d'horribles dépendances cyclistes et un désordre complet.

Avec la bibliothèque partagée, c'est un peu plus de travail car le développeur doit modifier le système de construction du projet pour ajouter la bibliothèque dépendante. J'ai observé que le code de bibliothèque partagée tend à offrir une API de code plus propre.


2
2017-10-30 14:36