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