Convertire una libreria statica in una libreria condivisa?
-
19-08-2019 - |
Domanda
Ho una libreria di terze parti che consiste principalmente in un gran numero di file di libreria statici ( .a
). Posso compilarlo in un singolo file di libreria .a
, ma ho davvero bisogno che sia un singolo file di libreria condivisa .so
.
Esiste un modo per convertire un file .a
statico in un file .so
condiviso? O più in generale c'è un buon modo per combinare un numero enorme di file .a
statici con alcuni file oggetto .o
in un singolo .so
file?
Soluzione
Fa questo (con gli appropriati -L ovviamente)
gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib
Non farlo?
Altri suggerimenti
Non puoi farlo se gli oggetti all'interno della libreria statica sono stati compilati senza -fPIC o simili.
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
Non sono sicuro di gcc, ma per g ++ ho dovuto aggiungere l'opzione linker --whole-archive per includere gli oggetti dalle librerie statiche nell'oggetto condiviso. L'opzione --no-whole-archive è necessaria se si desidera collegarsi a libc_static_lib.a e libother_shared_object.so, ma non includerli nel loro insieme in megalib.so.
ar -x lib***.a
gcc -shared *.o -o lib***.so
ar -x
può anche essere utile se vuoi concentrarti su oggetti specifici dai tuoi .a
se non vuoi aggiungere nulla da solo.
Esempi:
ar -x lib***.a
gcc -shared *.o -o lib***.so