2009-03-17 35 views
40

Tengo una biblioteca de terceros que consiste principalmente en una gran cantidad de archivos de biblioteca estáticos (.a). Puedo compilar esto en un solo archivo de biblioteca .a, pero realmente necesito que sea un solo archivo de biblioteca compartida .so.¿Convertir una biblioteca estática a una biblioteca compartida?

¿Hay alguna forma de convertir un archivo estático .a en un archivo .so compartido? ¿O de forma más general, existe una buena forma de combinar una gran cantidad de archivos estáticos .a con unos pocos archivos de objeto .o en un único archivo .so?

Respuesta

34

hace esto (con apropiadas -L de por supuesto)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib 

no hacerlo?

+3

Usar gcc -shared hizo el truco, pero solo después de volver a compilar con -fPIC. ¡Gracias por señalarme en la dirección correcta! –

17

No puede hacer esto si los objetos dentro de la biblioteca estática se compilaron sin -fPIC o similares.

+2

En objetivos bien compatibles, 'PIC' no es esencial para el código de biblioteca compartida. Simplemente resulta en un uso mucho más eficiente de la memoria (la mayoría, en lugar de una minoría, de las páginas se pueden compartir) a expensas de algún rendimiento. –

+3

La falta de -fPIC o similar en algunas condiciones da como resultado SegFault –

9
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object 

no estoy seguro acerca de gcc, pero por g ++ he tenido que añadir la opción del vinculador --whole-archivo para incluir los objetos de las bibliotecas estáticas en el objeto compartido. La opción --no-whole-archive es necesaria si desea vincular a libc_static_lib.a y libother_shared_object.so, pero no incluirlos como un todo en megalib.so.

+1

'-Wl - no-whole-archive' es necesario al final de la línea de comando. Ver [la edición de la pregunta, aquí] (http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so). – ofavre

1

ar -x también puede ser útil si quiere centrarse en objetos específicos de su .a sy usted no desea agregar nada por su cuenta.

4
ar -x lib***.a 
gcc -shared *.o -o lib***.so 
Cuestiones relacionadas