2010-02-03 20 views
9

el título de esta pregunta es exact dupe, pero las respuestas en esa pregunta no me ayudan.Convierta una biblioteca estática a una biblioteca compartida (cree libsome.so de libsome.a): ¿dónde están mis símbolos?

Tengo un montón de archivos de objetos embalados en una biblioteca estática:

% 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 

me gustaría generar libsome.so de libsome.a en lugar de los archivos de objetos, pero la biblioteca es muy barebones:

% 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 biblioteca estática está bien, o al menos yo estoy perfectamente capaz de vincularlo a un ejecutable y hacer que se ejecute la funcionalidad contenida. también, todo está bien si creo libsome.so de foo.o y bar.o.

Respuesta

22

Suponiendo que está utilizando el enlazador GNU, debe especificar la opción --whole-archive para que obtenga todos los contenidos del archivo estático. Ya que es una opción enlazador, tendrá que contar -Wl gcc para pasarla a través del enlazador:

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

si estuviera haciendo algo más complicada en la que desea todas biblioteca de algunos, pero sólo la parte de la biblioteca apoyo que necesitan los libsome, que se quiere desactivar archivo entero después de haberlo utilizado en libsome:

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

Si usted no está utilizando el enlazador de GNU, que tendrá que ver si su enlazador lo admite y como se llama En el enlazador Sun, se llama -z allextract y -z defaultextract.

+0

+1 Ahí tienes. Intenté "man ld" y me perdí eso. –

+0

gracias, esto es todo! He buscado la página de manual de ld hacia arriba y hacia abajo, pero de alguna manera he perdido esta opción. –

+0

¡Ahora si solo esta excelente respuesta fuera a indicar también cómo configurar esto con un proyecto CMake! Gracias –

1

Sus archivos no se extraen del archivo .a porque nada hace referencia a ellos. ¿Por qué estás haciendo un archivo .a primero? Tendrías mejor suerte haciendo un archivo .o vinculándolos con la opción -r.

+0

cuando construyo libsome.so desde foo.o y bar.o, nada hace referencia a los símbolos, y sin embargo terminan en la biblioteca. y dado que el archivo '.a' es solo esos dos archivos' .o 'exactos unidos, debe * haber * una forma (simple) de usarlo en lugar de los archivos de objetos contenidos, ¿no? –

+0

Porque los archivos de objeto se extraen de un archivo .a solo si se hace referencia a un símbolo en ellos. Un archivo .o siempre está vinculado, referenciado o no. –

+0

ok, ignorando los detalles de mi situación: ¿hay o no hay una forma de convertir una biblioteca estática a una compartida * como si * se usaran los archivos '.o'? (descontando 'ar -x') –

Cuestiones relacionadas