GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo fusionar dos bibliotecas estáticas ar en una?

Hay al menos tres formas de hacer esto nativamente . La primera y más portátil forma es usar libtool. Después de haber creado las otras bibliotecas también con libtool, puede combinarlas simplemente agregando las bibliotecas .la 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 un script de resonancia magnética (llamado, por ejemplo, libaz.mri), como:

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

y luego ejecute ar como:

ar -M <libaz.mri

O puede usar un delgado archivo (opción -T ), lo que permitirá agregar otros archivos sin anidarlos dentro, aunque la desventaja es que si desea distribuir la biblioteca estática, faltará el objeto separado:

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

Todos los métodos anteriores manejan con gracia los nombres de miembros superpuestos de los archivos originales.

De lo contrario, tendría que descomprimir en diferentes directorios y volver a empaquetar, 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

Si simplemente lo haces como:

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

perderá algunos archivos de objetos si hay miembros con el mismo nombre tanto en a.a como en b.aso, 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 con el mismo nombre en un archivo (por ejemplo, en a.a), si ejecuta ar x a.a , solo obtendrá 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 mediante 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.

Uno opcional soluciones es que puede combinar varios archivos en una biblioteca compartida:

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

¡De esta forma, el enlazador se encargará de todo por ti!


Puede extraer el objeto tanto del .a archivos y crea tu .a archivo usando el .o extraído s:

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

Aún mejor, realiza un enlace parcial en cada biblioteca y luego crea un archivo de los dos archivos de objetos resultantes. De esa forma, funciona como lo harían las bibliotecas compartidas

Haces enlaces parciales con

gcc -r --nostdlib

entonces, en lugar de crear el archivo intermedio o después de volver a extraerlo, ejecute

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

entonces

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

Linux
  1. [AVANZADO] Cómo agrupar dos cuentas separadas en una cuenta con un dominio adicional

  2. ¿Es posible instalar dos servicios para un paquete usando Dh_installinit? ¿Cómo?

  3. ¿Cómo fusionar varias conexiones a Internet en una sola?

  4. ¿Cómo convertir un video de alta calidad en uno de baja calidad?

  5. cómo fusionar dos archivos consistentemente línea por línea

Cómo unir varias líneas en una en un archivo en Linux

Cómo combinar varios archivos PDF en un solo PDF en Linux

Cómo unir/combinar varios archivos de audio en uno solo en Linux

¿Cómo dividir una partición monolítica en dos, una para `/` y otra para `/home`?

Cómo hacer eco en un archivo

¿Cómo fusiono varias cuentas de cPanel en una sola?