Tengo bibliotecas estáticas Linux 2, creado 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 combinada, no dar ambas bibliotecas al enlace final de las aplicaciones.
linux
static-libraries
ar
osgx
fuente
fuente
libtool
libtool -static -o new.a old1.a old2.a
Respuestas:
Puede extraer el objeto de ambos
.a
archivos y crear su.a
archivo utilizando los.o
s extraídos :fuente
libabc.a
puede contener objetos con el mismo nombre (originados en diferentes directorios) - ¡el reensamblaje no funcionará entonces!ar -c
no funcionó para mí (Ubuntu 14.04). Tengoar: no operation specified
. En suar -qc
lugar, lo hice y funcionó bien.Hay al menos tres formas de hacer esto de forma nativa . La primera y más portátil forma es usar libtool. Después de haber construido las otras bibliotecas también con libtool, puede combinarlas simplemente agregando las .la libs a una variable libaz_la_LIBADD de automake, o directamente desde un Makefile con algo como:
Los otros dos están disponibles al menos cuando se usa GNU ar. Puede utilizar un script de MRI (llamado, por ejemplo, libaz.mri), como:
y luego ejecute ar como:
O puede usar un archivo delgado (opción
-T
), que permitirá agregar otros archivos sin anidarlos dentro, aunque la desventaja es que si desea distribuir la biblioteca estática, faltará el objeto separado: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 directorios diferentes y volver a empaquetar, para evitar reemplazar nombres de miembros superpuestos:
fuente
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Esto crea unlibaz.a
archivo delgado temporal y luego convierte el archivo delgado en uno normal (para que pueda moverlo / distribuirlo). Esto también maneja con gracia cuando los nombres de su biblioteca tienen caracteres especiales (espaciado, más o comas) (es decirar cqT libbundle.a libfoo++.a 'libbar baz.a'
). ¡Pero +1 de mí!libtool
, obtengo estos errores: ¿libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Alguna idea de cómo solucionarlo?--Wl,-whole-archive
se requiere la opción en el comando de vinculación original para múltiples lib * .a, y necesito combinar todos los lib * .a enone.a
. Cuando vuelva a vincular,--Wl,-whole-archive
no funcionará conone.a
. ¿Cuál es tu sugerencia? stackoverflow.com/questions/56323197/…Si simplemente lo hace como:
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:
además, es posible que haya varios miembros del mismo nombre en un archivo (digamos 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 mediante la opción 'N':
este 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:
de esta manera, el enlazador se encargará de todo por usted.
fuente
-fPIC
.Aún mejor, realiza un enlace parcial en cada biblioteca y ellos hacen un archivo de los dos archivos de objeto resultantes. De esa forma funciona como lo harían las bibliotecas compartidas
Haces enlaces parciales con
así que en lugar de hacer el archivo intermedio o después de volver a extraerlo, ejecute
entonces
fuente
ahora tienes dos versiones de "macroblock-10.o"
fuente
Aquí, crea un archivo de archivos y luego 'aplana' (adelgazamiento) el resultado con la bandera T. No estoy seguro de cómo funcionará con archivos del mismo nombre .o que podrían estar contenidos en.
fuente