2009-06-04 12 views
15

Estoy tratando de crear una única biblioteca estática que contenga archivos de objetos y bibliotecas estáticas existentes que se hayan compilado anteriormente en el proceso de compilación. ¿Hay una manera fácil de hacer esto usando "ar", o tendré que descomprimir (ar x library_name) cada biblioteca y agregar sus archivos de objeto a mi biblioteca unificada?Usando "ar" para combinar archivos .o y .a (Linux)

+0

Posible duplicado http: // stackoverflow.com/questions/386579/pack-shared-libraries-into-the-elf –

+0

No, no es un duplicado. Esa pregunta se refiere al intento de volver a vincularse con bibliotecas compartidas, mientras que esta pregunta trata sobre bibliotecas estáticas y objetos que aún no se han vinculado. – ephemient

+0

Si controla el proceso de compilación, este patrón parece una solución limpia: http://stackoverflow.com/a/4318960/78342 – Chinasaur

Respuesta

0

Necesitará extraer los archivos objeto de las otras bibliotecas y agrupar los archivos del objeto extraído en su biblioteca compuesta.

Ten en cuenta también la carga incremental: ld -r

7

Si desea crear una biblioteca compartida puede utilizar esto:

Puede utilizar el archivo --whole- bandera de ld:

--whole-archive
Para cada archivo mencionado en la línea de comando después de la opción --whole-archive, incluya cada archivo de objeto en el archivo en el enlace, en lugar de buscar en el archivo los archivos de objeto requeridos. Normalmente, esto se usa para convertir un archivo de almacenamiento en una biblioteca compartida, lo que obliga a que todos los objetos se incluyan en la biblioteca compartida resultante. Esta opción puede usarse más de una vez.

Dos notas al usar esta opción de gcc: Primero, gcc no conoce esta opción, por lo que debe usar -Wl, -whole-archive. Segundo, no olvides usar -Wl, -no-whole-archive después de tu lista de archivos, porque gcc agregará su propia lista de archivos a tu enlace y es posible que no quieras que esta bandera también los afecte.

Para las bibliotecas estáticas es posible que tenga que extraer los objetos primero.

me encontré con lo siguiente para ar

GNU ar opcionalmente puede crear un archivo delgada, que contiene un índice de símbolos y referencias a las copias originales de los archivos miembros de los archivos. Tal archivo es útil para construir bibliotecas para su uso dentro de una construcción local, donde se espera que los objetos reubicables permanezcan disponibles, y copiar el contenido de cada objeto solo perdería tiempo y espacio. Los archivos delgados también se aplanan, de modo que agregar uno o más archivos a un archivo delgado agregará los elementos del archivo anidado individualmente. Las rutas a los elementos del archivo se almacenan en relación con el archivo en sí.

Tal vez pueda utilizar un archivo tan thin.

+0

La opción de archivo delgado es (relativamente) reciente. No está disponible en Fedora 8 por ejemplo (ar 2.17.50). – neuro

+0

+1 por cierto para una opción interesante (--todo-archivo) que acaba de salvar mi vida! – neuro

1

Archivar los archivos siempre es posible. No probé si funciona cuando se llama a la API real desde la implementación.

Ex: ar rc lib1.a obj1.o ar rc lib2.a obj2.o ar rc lib3.a lib1.a lib2.a

you can check the contents of lib3.a by trying out. 

    ar x lib3.a which would extract lib1.a and lib2.a 

pero hay que construir llamar a la API de obj1.o y obj2.o. Entonces no hay necesidad de extraer los archivos objeto de los archivos individuales.

Espero que ayude!

Cuestiones relacionadas