web-dev-qa-db-fra.com

Comment fusionner deux bibliothèques statiques "ar" en une seule?

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

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

72
osgx

Vous pouvez extraire l'objet des fichiers .a et créer votre fichier .a à l'aide du .os extrait:

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

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

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

Les deux autres sont au moins disponibles lorsque vous utilisez GNU ar. Vous pouvez utiliser un script MRI (nommé par exemple libaz.mri), tel que:

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

puis exécutez ar comme:

ar -M <libaz.mri

Vous pouvez également utiliser un fichier thin archive (option -T), qui permettra d’ajouter d’autres archives sans les imbriquer, même si l’inconvénient est que si vous souhaitez distribuer la bibliothèque statique, l’objet détaché manquera:

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

Toutes les méthodes ci-dessus gèrent gracieusement les noms de membres qui se chevauchent dans les archives d'origine.

Sinon, vous devrez décompresser dans différents répertoires et remballer à nouveau, pour éviter de remplacer les noms de 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
85
Guillem Jover

Si vous le faites simplement comme:

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

vous perdrez des fichiers objets s'il y a des membres portant le même nom dans a.a et b.aso. Vous devez extraire les membres de différentes archives dans un dossier différent:

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

de plus, il est possible qu'il y ait plusieurs membres du même nom dans une archive (disons dans a.a). Si vous exécutez ar x a.a , vous n'en obtiendrez qu'un pour les membres du même nom.

Le seul moyen d'extraire tous les membres du même nom dans une archive est de spécifier le numéro de membre avec 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, vous devrez donc écrire un script plus sophistiqué pour faire ce travail.

One optional solutions vous permet de combiner plusieurs archives dans une bibliothèque partagée:

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

de cette façon, l'éditeur de liens gérera tout pour vous!

7
samuel.zzy220

Mieux encore, vous effectuez une liaison partielle sur chaque bibliothèque et vous créez une archive des deux fichiers objet résultants. De cette façon, il fonctionne comme des bibliothèques partagées

Vous faites des liens partiels avec 

gcc -r --nostdlib

donc soit au lieu de faire l'archive intermédiaire ou après le 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
0
Allan Jensen
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

maintenant vous avez deux version de "macroblock-10.o"

0
law wey