Convertir una biblioteca estática a una biblioteca compartida (crear libsome.so de libsome.a): ¿Dónde está mi símbolos?

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

Pregunta

el título de esta pregunta es un exacta víctima , pero las respuestas en esta pregunta no me ayudan.

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 en la biblioteca realmente 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.

¿Fue útil?

Solución

Si se asume que está utilizando el enlazador de GNU, es necesario especificar la opción --whole de archivado de manera que obtendrá 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 estaba haciendo algo más complicado en el que desea que todos los de la biblioteca algunos, pero sólo la parte de soporte de la biblioteca que necesita 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 sus enlazador soporta y cómo se llama. En el enlazador Sol, se llama -z allextract y -z defaultextract.

Otros consejos

Los archivos no están siendo tiró desde el archivo .a porque nada les hace referencia. ¿Por qué están haciendo un archivo .a primera? Usted tendría mejor suerte haciendo un archivo .o mediante su vinculación con la opción -r.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top