¿Convertir una biblioteca estática en una biblioteca compartida?
-
19-08-2019 - |
Pregunta
Tengo una biblioteca de terceros que consta principalmente de 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 archivo de biblioteca compartida .so
.
¿Hay alguna forma de convertir un archivo estático .a
en un archivo compartido .so
? O, en general, ¿hay una buena manera de combinar una gran cantidad de archivos estáticos .a
con unos pocos archivos de objetos .o
en un solo .so
archivo?
Solución
¿Esto (con los -L apropiados, por supuesto)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
¿No lo haces?
Otros consejos
No puede hacer esto si los objetos dentro de la biblioteca estática se compilaron 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 --whole-archive linker 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.
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x
también puede ser útil si desea enfocarse en objetos específicos de sus .a
sy no desea agregar nada por su cuenta.
Ejemplos:
ar -x lib***.a
gcc -shared *.o -o lib***.so