web-dev-qa-db-fra.com

Fichiers .o vs fichiers .a

Quelle est la différence entre ces deux types de fichiers. Je constate que mon application C++ est liée aux deux types lors de la construction de l'exécutable.

Comment construire des fichiers .a? les liens, références et surtout exemples sont très appréciés.

54
Sasha

.o les fichiers sont des objets. Ils sont la sortie du compilateur et l'entrée du lieur/bibliothécaire.

.a les fichiers sont des archives. Ce sont des groupes d'objets ou des bibliothèques statiques et sont également entrés dans l'éditeur de liens.

Contenu supplémentaire

Je n'ai pas remarqué la partie "exemples" de votre question. En général, vous utiliserez un makefile pour générer des bibliothèques statiques.

AR = ar 
CC = gcc

objects := hello.o world.o

libby.a: $(objects)
    $(AR) rcu $@ $(objects)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

Cela compilera hello.c et world.c en objets, puis les archiver dans la bibliothèque. Selon la plate-forme, vous devrez peut-être également exécuter un utilitaire appelé ranlib pour générer la table des matières sur l'archive.

Une note intéressante: .a les fichiers sont techniquement des fichiers d'archive et non des bibliothèques. Ils sont analogues aux fichiers Zip sans compression, bien qu'ils utilisent un format de fichier beaucoup plus ancien. La table des matières générée par des utilitaires comme ranlib est ce qui fait d'une archive une bibliothèque . Java fichiers d'archive (.jar) sont similaires car ce sont des fichiers Zip qui ont des structures de répertoires spéciales créées par l'archiveur Java.

58
D.Shawley

Un fichier .o est le résultat de la compilation d'une seule unité de compilation (essentiellement un fichier de code source, avec les fichiers d'en-tête associés) tandis qu'un fichier .a est un ou plusieurs fichiers .o regroupés sous forme de bibliothèque.

14
Vatine

La réponse de D Shawley est bonne, je voulais juste ajouter quelques points car les autres réponses reflètent une compréhension incomplète de ce qui se passe.

Gardez à l'esprit que les fichiers d'archives (.a) ne sont pas limités à contenir des fichiers objets (.o). Ils peuvent contenir des fichiers arbitraires. Pas souvent utile, mais voir informations de dépendance de l'éditeur de liens dynamiques intégrées dans une archive pour une astuce de l'éditeur de liens stupide.

Notez également que les fichiers objets (.o) ne sont pas nécessairement le résultat d'une seule unité de compilation. Il est possible de lier partiellement plusieurs fichiers objets plus petits en un seul fichier plus grand.

http://www.mihaiu.name/2002/library_development_linux/ - recherchez "partiel" dans cette page

11
bstpierre

Vous pouvez utiliser ar pour créer .a fichier (bibliothèque statique) de .o fichiers (fichiers objets)

Voir man ar pour plus de détails.

5
qrdl

Je crois qu'un fichier .a est une archive qui peut contenir plusieurs fichiers objets.

2
Dana Holt