Convierte una biblioteca estática a una biblioteca compartida?

Tengo una biblioteca de terceros que consiste principalmente en una gran cantidad de archivos de biblioteca estáticos ( .a ). Puedo comstackr esto en un solo archivo de biblioteca .a , pero realmente necesito que sea un solo archivo de biblioteca compartido .so .

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

Esto (con las -L apropiadas, por supuesto)

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

No lo hagas?

No puede hacer esto si los objetos dentro de la biblioteca estática fueron comstackdos sin -fPIC o similar.

 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 para g ++ tuve que agregar la opción del enlazador –whole-archive para incluir los objetos de las bibliotecas estáticas en el objeto compartido. La opción –no-whole-archive es necesaria si desea vincular libc_static_lib.a y libother_shared_object.so, pero no incluirlos como un todo en megalib.so.

 ar -x lib***.a gcc -shared *.o -o lib***.so 

ar -x también puede ser útil si quieres enfocarte en objetos específicos de tu .a y no quieres agregar nada por tu cuenta.