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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top