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:
- Les 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
- 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, où elle 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 au moment 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 sont fournies qu'à moi, je l'ai découvert les légères différences dans ces conditions, qui peut même être tout simplement des expressions familières dans mon secteur d'activité:
- 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.donc)
- 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)
- 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()
des commandes ainsi 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, comme il est seulement nécessaire au moment de l'dlopen
/dlsym
des appels sont faits. - Partagé Archive: Essentiellement la même qu'une bibliothèque statique, mais est compilé avec la fonction "exporter partagés" drapeau. La bibliothèque est inclus dans le lien de la liste au moment de la compilation (c'est à dire: LDOPTS+=-lmylib
S
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.