GNU/Linux >> Tutoriels Linux >  >> Linux

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

Il y a au moins trois façons de le faire nativement . 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 simplement en ajoutant les bibliothèques .la à 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 de 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

Ou vous pouvez utiliser un mince archiver (option -T ), ce qui permettra d'ajouter d'autres archives sans les imbriquer à l'intérieur, même si l'inconvénient est que si vous souhaitez distribuer la bibliothèque statique, l'objet détaché sera manquant :

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

Toutes les méthodes ci-dessus gèrent avec élégance les noms de membres qui se chevauchent à partir des archives d'origine.

Sinon, vous devrez décompresser dans différents répertoires et recompresser à 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 certains fichiers objet s'il y a des membres avec le même nom dans a.a et b.aso, vous devez extraire des 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 (par exemple dans a.a), si vous exécutez ar x a.a , vous n'en obtiendrez qu'un pour les membres du 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, vous devrez donc écrire un script plus sophistiqué pour faire ce travail.

Un facultatif solutions est que vous pouvez combiner plusieurs archives en une seule bibliothèque partagée :

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

de cette façon, l'éditeur de liens s'occupera de tout pour vous !


Vous pouvez extraire l'objet à la fois du .a fichiers et créez votre .a fichier utilisant le .o extrait s :

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

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

Vous faites un lien partiel avec

gcc -r --nostdlib

donc soit au lieu de faire l'archive intermédiaire soit après l'avoir réextraite, lancez

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

alors

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o

Linux
  1. Est-il possible d'installer deux services pour un package à l'aide de Dh_installinit ? Comment?

  2. Comment fusionner plusieurs connexions Internet en une seule ?

  3. Comment convertir une vidéo de haute qualité en une vidéo de basse qualité ?

  4. Comment diviser un fichier texte en plusieurs fichiers *.txt ?

  5. Fusionner deux fichiers HTML dans le fichier HTML maître

Comment joindre plusieurs lignes en une seule dans un fichier sous Linux

Comment fusionner plusieurs fichiers PDF en un seul PDF sous Linux

Comment joindre/fusionner plusieurs fichiers audio en un seul sous Linux

Comment diviser une partition monolithique en deux, une pour `/` et une pour `/home` ??

Comment faire écho dans le fichier

Comment fusionner plusieurs comptes cPanel en un seul