Quelle est la différence entre .a
.o
et .lo
fichier en C?
Le fichier '.lo' est un objet bibliothèque , qui peut être intégré dans une bibliothèque partagée, et le fichier '.o' est un fichier objet standard
Le fichier .lo est l'objet libtool , que Libtool utilise pour déterminer quel fichier objet peut être intégré dans une bibliothèque partagée
Remarque:
Bien que j'aime les réponses ci-dessus, elles ne couvrent pas le formulaire de bibliothèque .a/archive. Donc, ici, je vais aborder les trois avec un bonus d'ajout dans un format de bibliothèque .so, ainsi. De plus, dans la veine de stackexchange, j'utiliserai plus de texte au cas où les liens se briseraient (notez que je n'avais pas besoin de liens de référence pour celui-ci).
Lors de la compilation d'un fichier . O est un fichier objet contenant le code objet émis par le compilateur pour la plate-forme cible. Pour créer un fichier . O :
gcc -c filename.c <==== creates filename.o
Notez que cet exemple n'a pas créé de code indépendant de position (PIC). Nous considérons cela comme un objet pouvant être inclus dans une bibliothèque statique ou un exécutable. Autrement dit, lorsque nous lions un exécutable avec un fichier . O , le code du fichier .o est inséré dans l'exécutable --- il est lié au moment de la construction, pas au moment de l'exécution. Cela signifie que l'exécutable peut être redistribué sans inclure le fichier .o. Attention: il est conventionnel que le fichier . O soit considéré comme non PIC. Nous nommons généralement les fichiers d'objets PIC avec une extension . Lo .
Le type de fichier . A est une bibliothèque "archive". Il contient un ou plusieurs fichiers .o et il est généralement utilisé pour créer des fichiers exécutables statiques.
Nous utilisons la commande ar pour manipuler les bibliothèques d'archives. Ci-dessous dans un exemple qui (1) crée une bibliothèque d'archives à partir de . O fichiers puis (2) répertorie le contenu d'un.
Créer la bibliothèque
$ ls *.o
a.o b.o c.o <=== the files going in the archive
$ ar q libmyStuff.a *.o <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a
$ ls *.a <=== just show the library created
libmyStuff.a
Afficher le contenu d'une bibliothèque d'archives
$ ar t libmyStuff.a
a.o
b.o
c.o
L'utilisation de . Lo est une convention qui est souvent utilisée pour les fichiers d'objets indépendants de la position. Dans le répertoire courant, la commande libtool compile crée à la fois un fichier . Lo et un fichier .o , un avec code PIC et un sans code PIC. Voir la sortie ci-dessous:
$ libtool compile gcc -c a.c
libtool: compile: gcc -c a.c -fPIC -DPIC -o .libs/a.o <== PIC code
libtool: compile: gcc -c a.c -o a.o >/dev/null 2>&1 <== Not-PIC code
$ ls a.lo a.o
a.lo a.o <=== a.lo contains the PIC code.
Notez également que le sous-répertoire . Libs a été créé avec a.o . Ce fichier est du code PIC, malgré son nom. Libtool a déplacé ce fichier dans le répertoire courant et a changé l'extension en . Lo .
Vous pouvez toujours créer manuellement . Lo simplement en utilisant les options PIC pour gcc lors de la compilation. Déplacez les fichiers . O résultants vers l'extension . Lo .
Par convention .so implique un fichier de bibliothèque "objet partagé". Nous plaçons les fichiers d'objets PIC dans des bibliothèques partagées. Sous contrat avec . O et . A fichiers, lorsque nous lions avec . donc fichiers le code n'est pas inclus dans le fichier compilé résultant. C'est-à-dire que nous utilisons la liaison d'exécution (comme dans le cas . Lo ). Il existe plusieurs formes de liaison d'exécution, mais nous n'entrerons pas dans le détail ici.
Le .lo
le fichier est un objet de bibliothèque, qui peut être intégré dans une bibliothèque partagée, et le .o
fichier est un fichier objet standard. Plus d'informations: Comment installer et utiliser la bibliothèque partagée libtool (fichiers .lo)?