Convertire una libreria statica ad una libreria condivisa (creare libsome.so da libsome.a): dov'è il mio simboli?

StackOverflow https://stackoverflow.com/questions/2193944

Domanda

il titolo di questa questione è un esatto vittima , ma le risposte a questa domanda non mi aiutano.

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, va tutto bene se creo libsome.so da foo.o e bar.o.

È stato utile?

Soluzione

Supponendo che si sta utilizzando il linker GNU, è necessario specificare l'opzione --whole-archivio in modo che si otterrà tutto il contenuto dell'archivio statica. 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 stava facendo qualcosa di più complicato in cui si desidera che tutti biblioteca alcuni, ma solo la parte di supporto libreria richiesta da 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 i vostri supporti linker IT e come si chiama. Sul linker sole, si chiama -z allextract e -z defaultextract.

Altri suggerimenti

I file non sono di essere tirato dal file .a perché nulla li fa riferimento. Perchè si stanno facendo un file .a prima? Avresti migliore fortuna fare un file .o, collegandoli con l'opzione -r.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top