2010-02-03 8 views
9

il titolo di questa domanda è un exact dupe, ma le risposte in quella domanda non mi aiutano.Converti una libreria statica in una libreria condivisa (crea libsome.so da libsome.a): dove sono i miei simboli?

Ho un sacco di file oggetto imballato in una libreria statica:

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp 
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp 
% ar -rc libsome.a foo.o bar.o 

mi piacerebbe per generare libsome.so da libsome.a anziché i file oggetto, ma la biblioteca è davvero barebone:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a 
% nm -DC libsome.so 
0000xxxx A _DYNAMIC 
0000xxxx A _GLOBAL_OFFSET_TABLE_ 
     w _Jv_RegisterClasses 
0000xxxx A __bss_start 
     w __cxa_finalize 
0000xxxx A _edata 
0000xxxx A _end 
0000xxxx T _fini 
0000xxxx T _init 

la libreria statica è ok, o almeno io sono perfettamente in grado di collegarlo a un eseguibile e fare eseguire la funzionalità contenute. inoltre, tutto va bene se creo libsome.so da foo.o e bar.o.

risposta

22

Supponendo che si stia utilizzando il linker GNU, è necessario specificare l'opzione --whole-archive in modo da ottenere tutti i contenuti dell'archivio statico. Dal momento che questa è un'opzione del linker, è necessario -Wl dire a gcc di passare attraverso al linker:

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a 

se si stesse facendo qualcosa di più complicato in cui si desidera che tutti biblioteca alcuni, ma solo la parte della libreria supporto necessario per libsome, si vorrebbe spegnere intero archivio dopo aver utilizzato su libsome:

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a 

Se non si utilizza il linker GNU, avrete bisogno di vedere se il linker lo supporta e come si chiama. Sul linker Sun, si chiama -z allextract e -z defaultextract.

+0

+1 Ci vai. Ho provato "man ld" e l'ho perso. –

+0

grazie, questo è! ho cercato la manpage di ld su e giù, ma in qualche modo ho perso questa opzione. –

+0

Ora, se solo questa eccellente risposta dovesse indicare anche come impostare questo con un progetto CMake! Grazie –

1

I file non vengono estratti dal file .a perché non fanno riferimento a tali file. Perché stai facendo un file .a prima? Avresti miglior fortuna a creare un file .o collegandoli con l'opzione -r.

+0

quando costruisco libsome.so da foo.o e bar.o, niente fa riferimento ai simboli, eppure finiscono nella libreria. e dal momento che il file '.a' è un insieme di quei due file esatti' .o' schiacciati insieme, là * dovrebbe * essere un (semplice) modo di usarlo al posto dei file oggetto contenuti, no? –

+0

Poiché i file oggetto vengono estratti da un file .a solo se viene fatto riferimento a un simbolo al loro interno. Un file .o è sempre collegato, referenziato o meno. –

+0

ok, ignorando le specifiche della mia situazione: c'è o non c'è un modo per convertire una libreria statica in una condivisa * come se * fossero usati i file '.o'? (scontando 'ar -x') –