2010-05-11 50 views
6

Tengo una biblioteca compartida con algunas funciones caseras, que compilo en mis otros programas, pero tengo que vincular el programa final con todas las bibliotecas que he utilizado para compilar la biblioteca estática. Aquí hay un ejemplo:Compilar una biblioteca compartida estáticamente

Tengo la función foo en la biblioteca que requiere una función de otra biblioteca libbar.so.

En mi programa principal para usar la función foo tengo que compilarlo con la bandera -lbar. ¿Hay alguna manera de que pueda compilar mi biblioteca estáticamente, por lo que incluye todo el código requerido de las otras bibliotecas, y puedo compilar mi programa final sin necesitar el indicador -lbar?

+0

Podría indicar explícitamente las plataformas en uso? Idealmente, estarían en las etiquetas. –

+0

ejecutándose en linux –

+0

nota lateral; no solo no tendrías que -lbar, sino que una vez que comiences, tu enlazador eliminará todos los símbolos a los que * tu * código no hace referencia (directa o indirectamente hacia abajo a través de tu cadena de llamadas). ¡Esto reducirá tu ejecutable y ayudará a que tu aplicación se inicie más rápido! – Armentage

Respuesta

5

Los objetos compartidos (.so) no son bibliotecas, son objetos. No puede extraer parte de ellos e insertarlo en otras bibliotecas.

Lo que puede hacer si construye un objeto compartido que hace referencia al otro, pero el otro será necesario en tiempo de ejecución. Simplemente agregue la barra -l al vincular libfoo.

Si puede compilar libbar, obviamente puede crear una biblioteca que sea la combinación de libfoo y libbar. IIRC, también puede hacer que el vinculador construya una biblioteca que sea libfoo y la parte necesaria de libbar al vincular un .a con el .o destinado a entrar en libbar. Ejemplo:

gcc -fPIC -c lib1.c  # define foofn(), reference barfn1() 
gcc -fPIC -c lib2a.c # define barfn1(), reference barfn2() 
gcc -fPIC -c lib2b.c # define barfn2() 
gcc -fPIC -c lib2c.c # define barfn3() 
gcc -c main.c   # reference foofn() 
ar -cru libbar.a lib2*.o 
gcc -shared -o libfoo.so lib1.o -L. -lbar 
nm libfoo.so | grep barfn2() # ok, not here 
gcc -o prog main.o -L. -lfoo 
env LD_LIBRARY_PATH=. ./prog # works, so foofn(), barfn1() and barfn2() are found 
3

Paso 1 (Crear archivo de objeto):

gcc -c your.c -o your.o 

Paso 2 (Crear biblioteca estática):

ar rcs libyour.a your.o 

Paso 3 (Link contra biblioteca estática):

gcc -static main.c -L. -lyour -o statically_linked 
1

Básicamente, si usted tiene las librerías enlazadas estáticamente de las bibliotecas del sistema que su biblioteca estática depende, puede estáticamente eslabón de todo el código de ellos.

No estoy seguro de por qué, sin embargo. * El manejo de las bibliotecas compartidas por parte de las plataformas NIX es un trabajo genial y reduce drásticamente el tamaño del programa compilado. Si le preocupa no poder ejecutar el código en una computadora diferente debido a que faltan bibliotecas, entonces siempre puede tomar el camino de la mayoría de los programas de código cerrado compilados para las bibliotecas de Linux: simplemente compílelos con las opciones -Wl,--rpath -Wl,. de GCC y distribúyalo. biblioteca junto con el binario.

Cuestiones relacionadas