Question

J'ai 2 statiques bibliothèques Linux, créées par ar cr, libabc.a et libxyz.a.
Je veux les fusionner en un seul libaz.a de bibliothèque statique.
Comment puis-je faire cela.

Je veux créer une bibliothèque statique fusionné, de ne pas donner les deux bibliothèques de lien final des applications.

Était-ce utile?

La solution

Vous pouvez extraire l'objet à la fois les fichiers .a et créez votre fichier .a en utilisant les extraits .os:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

Autres conseils

Il y a au moins trois façons de le faire en mode natif . La première et la plus portable est d'utiliser libtool. Après avoir construit les autres bibliothèques aussi avec libtool, vous pouvez les combiner en ajoutant simplement les .la libs à une variable automake libaz_la_LIBADD, ou directement à partir d'un Makefile avec quelque chose comme:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

Les deux autres sont au moins disponibles lors de l'utilisation ar GNU. Vous pouvez utiliser un script IRM (nommé par exemple libaz.mri), tels que:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

et puis exécutez ar comme:

ar -M <libaz.mri

Ou vous pouvez utiliser un mince archives (en option -T), ce qui permettra d'ajouter d'autres archives sans les pénétrer à l'intérieur imbriquée, bien que l'inconvénient est que si vous souhaitez distribuer la bibliothèque statique, le détaché objet est manquant:

ar -rcT libaz.a libabc.a libxyz.a

Toutes les méthodes ci-dessus traitent avec élégance qui se chevauchent les noms des membres des archives originales.

Dans le cas contraire, vous auriez à déballer dans différents répertoires et repack à nouveau, pour éviter de remplacer les noms des membres qui se chevauchent:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

Si vous faites simplement comme:

ar x a.a
ar x b.a
ar c c.a  *.o 

vous perdu des fichiers objets s'il y a des membres avec le même nom dans les deux A.Une et B.Une , vous devez membres extrait de différentes archives dans un autre dossier:

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

encore plus, il est posible qu'il ya plusieurs membres du même nom dans une archive (dire aa), si vous exécutez ar x aa , vous obtiendrez seulement un pour les membres de même nom.

La seule façon d'extraire tous les membres du même nom dans une archive est de spécifier le numéro de membre par l'option « N »:

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

ce serait un travail fastidieux, de sorte que vous devrez écrire un script plus sophistiqué pour faire ce travail.

Une option des solutions est que vous pouvez combiner plusieurs archives dans une bibliothèque partagée:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

cette façon, l'éditeur de liens se chargera de toutes les choses pour vous!

Encore mieux que vous effectuez la liaison partielle sur chaque bibliothèque et les faire une archive des deux fichiers objet résultant. De cette façon, il fonctionne comme des bibliothèques partagées serait

Vous faites liaison partielle avec

gcc -r --nostdlib

donc soit au lieu de faire l'archive intermédiaire ou après réextraire, exécutez

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

puis

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

vous avez maintenant deux versions de "macrobloc-10.o"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top