2012-01-10 11 views

Respuesta

6

No entiendo por qué no pudo simplemente crear los archivos de su biblioteca dinámica en archivos .o y vincularlos;

gcc -shared *.o -lstaticlib1 -lstaticlib2 -o mylib.so 
+0

Lo que pasa es que puede omitir '* .o', si no las tiene – Lol4t0

+0

Las bibliotecas estáticas solo incorporarán su código si se hace referencia a ellas, de todos modos, no puede omitir todas las' .o' – bdonlan

+0

. que si hay varias instancias de la misma biblioteca estática en el mismo ejecutable (cargadas indirectamente a través de bibliotecas compartidas que contienen las librerías estáticas), pueden suceder cosas extrañas – bdonlan

13

Puede (simplemente extraer todos los archivos .o y vincularlos con -shared hacer una .so), sino si funciona, y lo bien que funciona, depende de la plataforma y si la biblioteca estática fue compilado como código de posición independiente (PIC). En algunas plataformas (por ejemplo, x86_64), el código que no es de PIC no es válido en las bibliotecas compartidas y no funcionará (en realidad, creo que el vinculador se negará a hacer el .so). En otras plataformas, el código que no es PIC funcionará en bibliotecas compartidas, pero la copia en memoria de la biblioteca no se puede compartir entre los diferentes programas que la usan o incluso instancias diferentes del mismo programa, por lo que resultará en ENORME pérdida de memoria.

+1

¡Gracias por esta respuesta tan útil! Supongo que esta es la mejor explicación para este error al hacer esto en x86_64: 'la reubicación R_X86_64_32S contra 'g_gGlobalVariable' no se puede usar cuando se hace un objeto compartido; recompilar con -fPIC ' – dashesy

Cuestiones relacionadas