Différence entre les objets partagés.donc), les bibliothèques statiques (.a), et DLL (.afin)?

J'ai été impliqué dans un débat à l'égard des bibliothèques dans Linux, et tiens à confirmer certaines choses.

Il est de ma compréhension (corrigez-moi si je me trompe et je vais modifier mon post plus tard), qu'il y a deux façons d'utiliser les bibliothèques lors de la construction d'une application:

  1. Bibliothèques statiques (.un fichiers): Au moment de la liaison, une copie de l'ensemble de la bibliothèque est mise à la version finale de l'application, de sorte que les fonctions au sein de la bibliothèque sont toujours disponibles à la demande
  2. D'objets partagés.donc les fichiers): Au moment de la liaison, l'objet est vérifiée par rapport à son API via le correspondant de l'en-tête (.h) fichier. La bibliothèque n'est pas réellement utilisé jusqu'à l'exécution, là où c'est nécessaire.

L'avantage évident des bibliothèques statiques, c'est qu'ils permettent à l'ensemble de l'application pour être autonome, tandis que le bénéfice des bibliothèques dynamiques, c'est que l' ".donc" fichier peut être remplacé (c'est à dire: dans le cas où il doit être mis à jour en raison d'un bogue de sécurité) sans nécessiter l'application de base pour être recompilé.

J'ai entendu certaines personnes font une distinction entre les objets partagés et les bibliothèques de liens dynamiques (DLL), même si elles sont à la fois ".de sorte que" les fichiers. Est-il une distinction entre les objets partagés et les Dll quand il s'agit de développement C/C++ sur Linux ou tout autre compatible POSIX OS (c'est à dire: MINIX, UNIX, QNX, etc)? Je me dit que la clé de la différence (pour l'instant), c'est que les objets partagés sont juste utilisés lors de l'exécution, tandis que la DLL doit être ouvert à l'aide de la dlopen() appel à l'intérieur de l'application.

Enfin, j'ai également entendu certains développeurs mention "partagé archives", qui, à ma connaissance, sont également statiques des bibliothèques elles-mêmes, mais ne sont jamais utilisés par une application directement. Au lieu de cela, d'autres bibliothèques statiques permettra de relier contre le "partage des archives" de tirer certaines (mais pas toutes) des fonctions/ressources par le partage de l'archive dans la bibliothèque statique en cours de construction.

Je vous remercie tous d'avance pour votre aide.

Mise à jour


Dans le contexte dans lequel ces termes ont été fournies pour moi, c'est effectivement erronée des termes utilisés par une équipe de développeurs Windows qui ont dû apprendre Linux. J'ai essayé de les corriger, mais les (mauvaises) langues normes coincé.

  1. De l'Objet partagé: Une bibliothèque qui est automatiquement lié à un programme lorsque le programme démarre, et existe sous forme d'un fichier autonome. La bibliothèque est inclus dans le lien de la liste au moment de la compilation (c'est à dire: LDOPTS+=-lmylib pour un fichier de bibliothèque nommée mylib.so). La bibliothèque doit être présent au moment de la compilation, et lorsque l'application démarre.
  2. Statique de la Bibliothèque: Une bibliothèque qui est fusionné dans le programme lui-même au moment de la construction pour une seule (grande) de l'application contenant le code de l'application et le code de la bibliothèque qui est automatiquement lié à un programme lorsque le programme est construit, et la finale binaire contenant le programme principal et la bibliothèque elle-même n'existe qu'une seule et même fichier binaire. La bibliothèque est inclus dans le lien de la liste au moment de la compilation (c'est à dire: LDOPTS+=-lmylib pour un fichier de bibliothèque nommée mylib.a). La bibliothèque doit être présent au moment de la compilation.
  3. DLL: Essentiellement le même comme un objet partagé, mais plutôt que d'être inclus dans le lien de la liste au moment de la compilation, la bibliothèque est chargé par dlopen()/dlsym() commandes de façon à ce que la bibliothèque n'a pas besoin d'être présent au moment de la construction pour le programme à compiler. Aussi, la bibliothèque n'a pas besoin d'être présent (nécessairement) au démarrage de l'application ou de la compilation, comme il est seulement nécessaire au moment de la dlopen/dlsym les appels sont effectués.
  4. Partagé Archive: Essentiellement la même qu'une bibliothèque statique, mais est compilé avec la fonction "exporter partagés" et "-fPIC" drapeaux. La bibliothèque est inclus dans le lien de la liste au moment de la compilation (c'est à dire: LDOPTS+=-lmylibS pour un fichier de bibliothèque nommée mylibS.a). La distinction entre les deux est que cet indicateur supplémentaire est nécessaire si un objet partagé ou DLL veut lier statiquement partagé archive dans son propre code ET être en mesure de faire les fonctions de l'objet partagé disponible pour d'autres programmes, plutôt que de simplement en utilisant internes à la DLL. Ceci est utile dans le cas où quelqu'un vous offre une bibliothèque statique, et que vous souhaitez remballer comme une SORTE. La bibliothèque doit être présent au moment de la compilation.

De Mise À Jour Supplémentaire

La distinction entre "DLL" et "shared library" était juste un (paresseux, inexactes) colloquialism dans la compagnie pour laquelle je travaillais à l'époque (les développeurs Windows étant contraints de passer pour le développement de Linux, et le terme coincé), en respectant les descriptions mentionnées ci-dessus.

En outre, la fin "S" littérale après le nom de la bibliothèque, dans le cas du "partage des archives" était juste une convention utilisée dans cette entreprise, et non pas dans l'industrie en général.

  • Pour .a fichiers, le "a" signifie "archove", et c'est tout simplement une archive de fichiers de l'objet. Moderne linkers devrait être assez bon pour ne pas avoir besoin d'inclure le tout en bibliothèque, il suffit de les objets les fichiers dans l'archive qui est nécessaire, et pourrait même simplement utiliser les sections de code ou de données dans les fichiers objets sont référencés.
  • DLL est juste de la terminologie Windows. Il n'est pas utilisé sur unix.
  • double possible de Pourquoi sont statiques et dynamiques couplés bibliothèques différentes?
  • Lire tldp.org/HOWTO/Program-Library-HOWTO
  • Vouliez-vous dire "arcsve" ou "arcive". J'ai googlé l'ancien, et ne pouvez pas trouver toute la littérature se référant à cette littéral du terme. Merci!
  • bien sûr. 🙂

InformationsquelleAutor DevNull | 2012-03-13