web-dev-qa-db-fra.com

Quelle est la différence entre les fichiers .o .a et .so?

Je sais que .o sont des fichiers objets, .a sont des bibliothèques statiques et .so sont des bibliothèques dynamiques? Quelle est leur signification physique? Quand puis-je en utiliser et quand non?

24

.a Est une "archive". Bien qu'une archive puisse contenir n'importe quel type de fichier, dans le contexte de la chaîne d'outils GNU, il s'agit d'une bibliothèque de fichiers objets (d'autres chaînes d'outils, en particulier sur Windows, utilisent .lib Pour la même chose). but, mais le format de ceux-ci n'est généralement pas une archive à usage général, et souvent spécifique à la chaîne d'outils.) Il est possible d'extraire des fichiers d'objet individuels d'une archive qui est essentiellement ce que fait l'éditeur de liens lorsqu'il utilise la bibliothèque.

.o Est un fichier objet. Il s'agit de code qui est compilé en code machine mais pas (généralement) entièrement lié - il peut avoir des références non résolues à des symboles définis dans d'autres fichiers objets (dans une bibliothèque ou individuellement) générés par une compilation séparée. Les fichiers objets contiennent des métadonnées pour prendre en charge la liaison avec d'autres modules, et éventuellement pour le débogage symbolique au niveau source (dans GDB par exemple). D'autres chaînes d'outils, toujours sous Windows, utilisent l'extension .obj Plutôt que .o.

.so Est une bibliothèque d'objets partagée (ou simplement une bibliothèque partagée). Ceci est lié dynamiquement à un exécutable quand un programme est lancé plutôt que lié statiquement au moment de la construction. Il permet à des exécutables plus petits et à une seule instance de bibliothèque d'objets d'être utilisés par plusieurs exécutables. Les API du système d'exploitation sont généralement des bibliothèques partagées, et elles sont souvent utilisées également dans GNU pour des raisons de licence pour séparer le code LGPL du code propriétaire de source fermée par exemple (je ne suis pas avocat - je fais aucune réclamation concernant la légitimité de cette approche dans une situation particulière. Contrairement aux fichiers .o ou .a, les fichiers .so utilisés par une application doivent être disponibles sur le système d'exécution. Autre les systèmes (généralement Windows) utilisent .dll (bibliothèque de liens dynamiques) dans le même but.

Il est peut-être utile de comprendre que les fichiers .o Sont liés avant le code objet dans les fichiers .a De telle sorte que si une résolution de symbole est satisfaite par un .o , aucune implémentation de bibliothèque ne sera liée - vous permettant de remplacer essentiellement les implémentations de bibliothèque par les vôtres, et également pour les implémentations de bibliothèque d'appeler du code défini par l'utilisateur - par exemple, une infrastructure GUI peut appeler un point d'entrée d'application.

45
Clifford

Les bibliothèques statiques sont des archives qui contiennent le code objet de la bibliothèque, lorsqu'elles sont liées à une application, ce code est compilé dans l'exécutable.

Les bibliothèques partagées sont différentes en ce qu'elles ne sont pas compilées dans l'exécutable. Au lieu de cela, l'éditeur de liens dynamique recherche certains répertoires à la recherche des bibliothèques dont il a besoin, puis les charge en mémoire. Plus d'un exécutable peut utiliser la même bibliothèque partagée en même temps, réduisant ainsi l'utilisation de la mémoire et la taille de l'exécutable. Cependant, il y a alors plus de fichiers à distribuer avec l'exécutable. Vous devez vous assurer que la bibliothèque est installée sur le système de l'utilisateur quelque part où l'éditeur de liens peut le trouver, la liaison statique élimine ce problème mais entraîne un fichier exécutable plus volumineux.

4
Prvn Yadav

.so sont des fichiers de bibliothèque partagée. .a sont des fichiers de bibliothèque statiques.

Vous pouvez lier statiquement aux bibliothèques .a et lier et charger dynamiquement les fichiers .so à l'exécution, à condition de les compiler et de les lier de cette façon.

.o sont des fichiers objets (ils sont compilés à partir de fichiers * .c et peuvent être liés pour créer des exécutables, des bibliothèques .a ou .so. En savoir plus ici

1
rost0031