J'ai participé à un débat sur les bibliothèques sous Linux et je voudrais confirmer certaines choses.
C'est à ma connaissance (veuillez me corriger si je me trompe et je modifierai mon article plus tard), qu'il existe deux façons d'utiliser les bibliothèques lors de la construction d'une application:
- Bibliothèques statiques (fichiers .a): au moment du lien, une copie de la bibliothèque entière est placée dans l'application finale afin que les fonctions de la bibliothèque soient toujours disponibles pour l'application appelante.
- Objets partagés (fichiers .so): au moment de la liaison, l'objet est simplement vérifié par rapport à son API via le fichier d'en-tête correspondant (.h). La bibliothèque n'est réellement utilisée qu'au moment de l'exécution, là où elle est nécessaire.
L'avantage évident des bibliothèques statiques est qu'elles permettent à l'application entière d'être autonome, tandis que l'avantage des bibliothèques dynamiques est que le fichier ".so" peut être remplacé (c'est-à-dire: au cas où il devrait être mis à jour en raison d'une sécurité bug) sans que l’application de base soit recompilée.
J'ai entendu certaines personnes faire une distinction entre les objets partagés et les bibliothèques liées dynamiques (DLL), même s'il s'agit à la fois de fichiers ".so". Existe-t-il une distinction entre les objets partagés et les DLL en ce qui concerne le développement C / C ++ sous Linux ou tout autre système d'exploitation compatible POSIX (par exemple: MINIX, UNIX, QNX, etc.)? On me dit qu'une différence clé (jusqu'à présent) est que les objets partagés sont juste utilisés au moment de l'exécution, tandis que les DLL doivent être ouvertes en premier en utilisant l'appel dlopen () dans l'application.
Enfin, j'ai également entendu certains développeurs mentionner les "archives partagées", qui, à ma connaissance, sont également des bibliothèques statiques elles-mêmes, mais ne sont jamais utilisées directement par une application. Au lieu de cela, d'autres bibliothèques statiques se lieront aux "archives partagées" pour extraire certaines (mais pas toutes) des fonctions / ressources de l'archive partagée dans la bibliothèque statique en cours de construction.
Merci d'avance à tous pour votre aide.
Mettre à jour
Dans le contexte dans lequel ces termes m'ont été fournis, il s'agissait effectivement de termes erronés utilisés par une équipe de développeurs Windows qui devaient apprendre Linux. J'ai essayé de les corriger, mais les normes linguistiques (incorrectes) sont restées.
- Objet partagé: bibliothèque qui est automatiquement liée à un programme au démarrage du programme et existe en tant que fichier autonome. La bibliothèque est incluse dans la liste de liens au moment de la compilation (c'est-à-dire:
LDOPTS+=-lmylib
pour un fichier de bibliothèque nommémylib.so
). La bibliothèque doit être présente au moment de la compilation et au démarrage de l'application. - Bibliothèque statique: bibliothèque qui est fusionnée dans le programme lui-même au moment de la construction pour une seule application (plus grande) contenant le code d'application et le code de bibliothèque qui est automatiquement lié à un programme lors de la construction du programme, et le binaire final contenant les deux le programme principal et la bibliothèque elle-même existent en tant que fichier binaire autonome unique. La bibliothèque est incluse dans la liste de liens au moment de la compilation (c'est-à-dire:
LDOPTS+=-lmylib
pour un fichier de bibliothèque nommé mylib.a). La bibliothèque doit être présente au moment de la compilation. - DLL: essentiellement identique à un objet partagé, mais plutôt que d'être incluse dans la liste de liens au moment de la compilation, la bibliothèque est chargée via
dlopen()
/dlsym()
commandes afin que la bibliothèque n'ait pas besoin d'être présente au moment de la compilation pour que le programme compile. De plus, la bibliothèque n'a pas besoin d'être présente (nécessairement) au démarrage de l'application ou au moment de la compilation , car elle n'est nécessaire qu'au moment où les appelsdlopen
/dlsym
sont effectués. - Archive partagée: essentiellement identique à une bibliothèque statique, mais est compilée avec les indicateurs "export-shared" et "-fPIC". La bibliothèque est incluse dans la liste de liens au moment de la compilation (c'est-à-dire:
LDOPTS+=-lmylibS
pour un fichier de bibliothèque nommémylibS.a
). La distinction entre les deux est que cet indicateur supplémentaire est requis si un objet partagé ou une DLL veut lier statiquement l'archive partagée dans son propre code ET pouvoir rendre les fonctions de l'objet partagé disponibles pour d'autres programmes, plutôt que de simplement les utiliser interne à la DLL. Ceci est utile dans le cas où quelqu'un vous fournit une bibliothèque statique et que vous souhaitez la reconditionner en tant que SO. La bibliothèque doit être présente au moment de la compilation.
Mise à jour supplémentaire
La distinction entre " DLL
" et " shared library
" n'était qu'un langage familier (paresseux, inexact) dans l'entreprise dans laquelle je travaillais à l'époque (les développeurs Windows étant obligés de passer au développement Linux, et le terme est bloqué), en respectant les descriptions mentionnées ci-dessus.
De plus, le " S
" littéral de fin après le nom de la bibliothèque, dans le cas des "archives partagées", n'était qu'une convention utilisée dans cette entreprise, et non dans l'industrie en général.
.a
fichiers, le "a" signifie en fait "archove", et c'est simplement une archive de fichiers objets. Les éditeurs de liens modernes devraient être assez bons pour ne pas avoir besoin d'inclure la bibliothèque while, juste les fichiers objets dans l'archive qui sont nécessaires, et pourraient même simplement utiliser les sections de code / données dans les fichiers objets référencés.