web-dev-qa-db-fra.com

Différence entre les fichiers .a .o et .lo

Quelle est la différence entre .a.o et .lo fichier en C?

61
Raj

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

34
DumbCoder

Différence entre .o, .a, .lo et .so.

Résumé

  • . o est généralement un fichier objet non PIC émis par le compilateur (avant l'étape de l'éditeur de liens) Lorsqu'il est lié avec un exe, le code sera inclus dans le exécutable - nous lions au moment du lien.
  • . a est généralement une bibliothèque d'archives contenant un ou plusieurs fichiers . o [non-PIC]. Lorsqu'il est lié à un exe, les fichiers "* .o" particuliers de l'archive seront insérés dans l'exécutable.
  • . lo est généralement un "objet de bibliothèque" qui contient du code PIC, qu'il soit compilé manuellement avec gcc -fPIC ou en utilisant libtool .
  • . Les fichiers sont donc des fichiers "objets partagés". Ils contiennent des objets PIC.

Remarque:

  • Si vous avez besoin d'exécutables statiques, utilisez les fichiers ".o" et ".a".
  • Si vous avez besoin/souhaitez que les exécutables dynamiques soient liés aux bibliothèques au moment de l'exécution, utilisez . Lo et . So fichiers.

Introduction

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).

Type de fichier .o

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 .

Type de fichier .a

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

Type de fichier .lo

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 .

Type de fichier .so

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.

72
uDude

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)?

4
Nav