2009-08-28 25 views
12

puedo construir un ejecutable con gcc con enlace estático:¿Es posible construir una biblioteca compartida con la biblioteca usada de enlace estático?

gcc -o -static xxx.c xxx

, así que puede funcionar sin ningún tipo de biblioteca xxx externo independiente.

Pero, ¿y si quiero construir una biblioteca compartida sin una biblioteca dependiente de externel? lo cual quiero decir que quiero la biblioteca compartida enlazado estáticamente su referencia externel en

Respuesta

12

esto funcionará:.

# Generate position independent code (PIC) 
gcc -fPIC -c -o xxx.o xxx.c 

# Build a shared object and link with static libraries 
ld -shared -static -o xxx.so xxx.o 

# Same thing but with static libc 
ld -shared -static -o xxx.so xxx.o -lc 

Una aclaración: la bandera -static, si se les da a gcc, se pasa al enlazador (ld) y le dice que trabaje con la versión estática (.a) de una biblioteca (especificada con el distintivo -l), en lugar de con la versión dinámica (.so).

Otra cosa: en mi sistema (Debian) el último ejemplo da un libc.a ... recompilar con -fPIC error. Estoy bastante seguro de que eso significa que la libc.a que tengo en mi sistema no se compiló con -fPIC. Un apt-cache search libc pic dio algunos resultados sin embargo.

Consulte también: Program Library HOWTO, SO: combining .so libs, ld(1), gcc(1)

+0

@Inshalla, creo que el problema es que posible que podamos enlazar dos .so a uno . Hasta ahora lo intenté y fallé. –

+0

Consulte el enlace '" SO: combine .so libs "' en mi respuesta. Parece que no hay una manera fácil de combinar bibliotecas dinámicas a menos que se hayan vinculado con el indicador '--relocatable' (consulte la página de manual de ld (1)). – Inshallah

+1

@Inshallah: si desea vincular un código que no sea de PIC a un objeto compartido, puede usar los indicadores "-mimpure-text" de gcc. El código no PIC en objetos compartidos funciona bien, pero tiene algunas compensaciones (las páginas de códigos no se pueden compartir entre procesos y requieren espacio de intercambio, las reubicaciones ralentizan la carga del objeto compartido aunque pueden ser ligeramente más rápidas en tiempo de ejecución ya que el código PIC es ~ 5% más lento). –

0

Si tienes planes de portabilidad para su biblioteca compartida, utilice libtool(1). Manejará la mayoría de los detalles de los indicadores del compilador para usted y le hará la vida infinitamente más fácil. Si no usa libtool, pero luego decide que desea transferir su programa a OS X o Windows, terminará reinventándolo de todos modos.

+0

@Chris Lutz, la biblioteca independiente de compilación se puede usar para fuentes cercanas o más fácil para el uso del cliente. –

+0

@arsane: libtool (1) le permitirá compilar bibliotecas de una manera más independiente de la plataforma. Ejecutará los comandos apropiados para construir una biblioteca (estática o compartida) para la plataforma en la que se ejecuta; Lo bueno es tenerlo incluso si no lo necesitas. – Inshallah

+2

@arsane - En general, las herramientas de GNU no requieren que usted licencie su código bajo licencias de GNU para usarlas. Puede compilar legalmente código de fuente cerrada con GCC y aún obtener los beneficios de la portabilidad de GCC en su código fuente cerrado, por lo que creo que puede usar libtool para compilar una biblioteca compartida sin tener que utilizar su biblioteca GPL. No soy abogado o experto, así que vea la licencia relevante, pero en general, GNU no hace eso. –

2

Hay un poco de hackery ordenada que puede hacer con rPath de modo que un ejecutable ELF o .so buscará su dependiente archivos .so por primera vez en el mismo directorio que sí:

  • hacer un pequeño script ECHO- rpath que consiste en

    echo '-Wl, - rpath = $ ORIGEN'

  • añadir que a su línea de comandos de compilación como gcc -o presentar -lwhatever `echo-rpath ` objetos

(El mecanismo de eco evita hacer o la cáscara de comer el signo $ y asegura que se pasa en ld.)

Cuestiones relacionadas