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.
Vous pouvez extraire l'objet des fichiers .a
et créer votre fichier .a
à l'aide du .o
s extrait:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
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
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!
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
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"