linux - library - make shared libraries
Cómo fusionar dos bibliotecas estáticas "ar" en una (3)
Tengo 2 bibliotecas estáticas de Linux, creadas por ar cr
, libabc.a
y libxyz.a
.
Quiero fusionarlos en una biblioteca estática libaz.a
.
Cómo puedo hacer esto.
Quiero crear una biblioteca estática fusionada, no para dar ambas bibliotecas al enlace final de las aplicaciones
Hay al menos tres formas de hacerlo de forma nativa . La primera y más portátil es usar libtool. Después de haber creado las otras bibliotecas también con libtool, puede combinarlas simplemente agregando .la libs a una variable automake libaz_la_LIBADD, o directamente desde un Makefile con algo como:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Los otros dos están al menos disponibles cuando se usa GNU ar. Puede usar una secuencia de comandos MRI (llamada, por ejemplo, libaz.mri), como:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
y luego ejecuta ar como:
ar -M <libaz.mri
O puede usar un archivo delgado (opción -T
), que permitirá agregar otros archivos sin tenerlos anidados en su interior, aunque la desventaja es que si desea distribuir la biblioteca estática, el objeto separado faltará:
ar -rcT libaz.a libabc.a libxyz.a
Todos los métodos anteriores manejan elegantemente los nombres de los miembros superpuestos de los archivos originales.
De lo contrario, tendría que descomprimir en diferentes directorios y volver a embalar, para evitar reemplazar nombres de miembros superpuestos:
mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz
Puede extraer el objeto de ambos archivos .a
y crear su archivo .a
utilizando los archivos .o
extraídos:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Si simplemente lo haces como:
ar x a.a
ar x b.a
ar c c.a *.o
Perderá algunos archivos de objeto si hay miembros con el mismo nombre tanto en aa como en ba, por lo que debe extraer miembros de diferentes archivos en una carpeta diferente:
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
Además, es posible que haya varios miembros del mismo nombre en un archivo (por ejemplo, en aa), si ejecuta ar x aa , obtendrá solo uno para los miembros del mismo nombre.
La única forma de extraer todos los miembros del mismo nombre en un archivo es especificar el número de miembro con la opción ''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
...
esto sería un trabajo tedioso, por lo que tendrá que escribir un guión más sofisticado para hacer ese trabajo.
Una solución opcional es que puede combinar varios archivos en una biblioteca compartida:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
¡de esta manera el enlazador manejará todas las cosas por ti!