Pregunta

Tengo bibliotecas estáticas Linux 2, creado por ar cr, libabc.a y libxyz.a.
Quiero agruparlos en un solo libaz.a biblioteca estática.
¿Cómo puedo hacer esto.

Quiero crear una biblioteca estática se fusionaron, para no dar a ambas bibliotecas último eslabón de aplicaciones.

¿Fue útil?

Solución

Se puede extraer el objeto tanto de los archivos .a y crear su archivo .a utilizando los .os extraídos:

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

Otros consejos

Hay por lo menos tres maneras de hacer esto nativa . La primera y más portátil manera es usar libtool. Después de haber construido las otras bibliotecas también con libtool, se pueden combinar simplemente añadiendo las librerías .la a una variable libaz_la_LIBADD automake, o directamente desde un Makefile con algo como:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

Los otros dos son al menos disponible cuando se utiliza ar GNU. Se puede utilizar un script de resonancia magnética (llamado así por ejemplo libaz.mri), como por ejemplo:

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

y luego ejecutar ar como:

ar -M <libaz.mri

o puede utilizar un delgada Archivo (opción -T), lo que permitirá la adición de otros archivos sin que ellos dentro anidada, aunque el inconveniente es que si se desea distribuir la biblioteca estática, la separa objeto no podrá contar con:

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

Todos los métodos anteriores con gracia manejan la superposición de nombres de los miembros de los archivos originales.

De lo contrario, tendría que descomprimir en diferentes directorios y rehacer de nuevo, para evitar la sustitución de la superposición de nombres de los miembros:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

Si simplemente como:

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

se le ha perdido algunos archivos objeto si hay miembros con el mismo nombre en tanto a.a y B.A. así, es necesario que los miembros de extracto de diferentes archivos en otra carpeta:

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

aún más, es Posible que hay varios miembros del mismo nombre en un archivo (digamos en AA), si ejecuta ar x AA , recibirá sólo una para aquellos miembros del mismo nombre.

La única manera de extraer todos los miembros del mismo nombre en un archivo es para especificar el número de socio por 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 opcional soluciones es que se puede combinar varios archivos en una sola biblioteca compartida:

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

De esta manera el enlazador se encargará de todas las cosas para usted!

Incluso mejor que realizar la vinculación parciales en cada biblioteca y les crea un archivo de los dos archivos de objetos resultantes. De esta manera opera como bibliotecas compartidas haría

Lo haces vinculación parcial con

gcc -r --nostdlib

Así que, o en lugar de hacer el archivo intermedio o después reextrayendo, 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
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

Ahora usted tiene dos versiones de "macrobloque 10.o"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top