2009-03-17 4 views
40

Ho una libreria di terze parti costituita principalmente da 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.Convertire una libreria statica in una libreria condivisa?

Esiste un modo per convertire un file statico .a in un file condiviso .so? O più in generale c'è un buon modo per combinare un numero enorme di file statici .a con alcuni file oggetto .o in un singolo file .so?

risposta

34

fa questo (con le appropriate -L 'naturalmente)

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

non farlo?

+3

L'utilizzo di gcc -shared ha funzionato, ma solo dopo che ho ricompilato con -fPIC. Grazie per avermi indicato nella giusta direzione! –

17

Non è possibile eseguire questa operazione se gli oggetti all'interno della libreria statica sono stati compilati senza -fPIC o simili.

+2

Su obiettivi ben supportati, 'PIC' non è essenziale per il codice di libreria condivisa. Porta solo a un uso molto più efficiente della memoria (la maggioranza, invece di una minoranza, delle pagine può essere condivisa) a scapito di alcune prestazioni. –

+3

Mancante di -fPIC o simile in alcune condizioni risulta in 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 

io non sono sicuro di gcc, ma per g ++ ho dovuto aggiungere l'opzione del linker --whole-archivio 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.

+1

'-Wl - no-whole-archive' è necessario alla fine della riga di comando. Vedi [la domanda modifica, qui] (http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so). – ofavre

1

ar -x può essere anche utile se si desidera mettere a fuoco determinati oggetti dal proprio .a se non si desidera aggiungere nulla da soli.

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