2010-11-30 52 views
3

Essentiellement, ce que je veux faire est la suivante:ar sur un fichier .a existant?

gcc foo.c -o foo.o 
ar rcs foo.a foo.o 
gcc bar.c -o boo.o 
ar rcs bar.a bar.o foo.a 

Je veux archiver à la fois un objet et une bibliothèque statique dans une autre bibliothèque statique. Malheureusement, la dernière commande ne contient pas foo.o (elle contient bar.o et foo.a), donc quand j'arrive à l'étape de liaison, l'éditeur de liens ne trouve pas les symboles de foo.o.

Existe-t-il un moyen de faire ce que je veux ici? Je fais tout cela hors de la forme, donc je cherche une solution qui n'implique pas d'extraire & ré-archivant les objets (ce qui semble assez douloureux). Existe-t-il un moyen de faire fonctionner ce type d'archivage à partir d'une autre archive?

Répondre

3

En fait, vous ne voulez pas archiver un fichier '.a' entier dans un autre fichier. Vous pourriez vouloir archiver les membres d'une archive dans l'autre - mais c'est une opération totalement différente. Le programme 'ar' est parfaitement capable de stocker des fichiers source, des fichiers tar gzippés, des fichiers HTML, des fichiers XML et à peu près tout autre type de fichier dans le '.a' (et le suffixe '.a' est seulement conventionnel, pas obligatoire) - essayez-le un certain temps. Cependant, il traite spécialement les fichiers objets (et uniquement les fichiers objet) et les rend disponibles pour l'éditeur de liens ('ld'), mais l'éditeur de liens n'utilise ces fichiers que si l'extension est '.a'.

Donc, vous voulez avoir deux bibliothèques:

  1. foo.a contenant juste foo.o
  2. bar.a contenant bar.o et tous les objets de foo.a

court de faire comme vous le suggérez et l'extraction du objets de foo.a et de les construire en bar.a, la seule alternative est de lister les membres de foo.a en tant que membres de bar.a aussi:

FOO_OBJS = foo.o 
BAR_OBJS = bar.o $(FOO_OBJS) 

foo.a: $(FOO_OBJS) 
    $(AR) $(ARFLAGS) [email protected] $(FOO_OBJS) 
bar.a: $(BAR_OBJS) 
    $(AR) $(ARFLAGS) [email protected] $(BAR_OBJS) 

Je suppose que votre exemple est réduit au minimum. Si ce n'est pas le cas, alors pourquoi s'embêter avec deux bibliothèques. Tout ce qui utilise juste le code de foo.o ne liera que foo.o même si on lui donne bar.a pour le lier. (Ce serait légèrement différent s'il s'agissait d'objets partagés, mais il serait probablement préférable de n'utiliser qu'un objet plutôt que deux.)

2
ar rcs foo.a foo.o 
cp foo.a foo2.a 
gcc -c bar.c 
ar rs foo2.a bar.o 

Et peut-être utiliser foo.a au lieu de foo2.a si vous n'avez pas besoin de le garder dans sa forme originale.