una que programacion librerías librerias libreria lenguaje estatica entre dinámicas dinamicas dinamica diferencia desarrolladas crear creacion crea con compilar como biblioteca c++ c static linker shared-libraries

c++ - que - Compilar una biblioteca compartida estáticamente



librerías dinámicas dll desarrolladas con java (4)

Básicamente, si tiene las bibliotecas vinculadas estáticamente de las bibliotecas del sistema de las que depende su biblioteca estática, puede vincular estáticamente en todo el código de ellas.

Aunque no estoy seguro de por qué. * 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: compilarlos con -Wl,--rpath -Wl,. opciones para GCC y distribuir la biblioteca junto con el binario.

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:

Tengo 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 . ¿Existe alguna forma de que pueda compilar mi biblioteca de manera estática, de modo que incluya todo el código requerido de las otras bibliotecas, y pueda compilar mi programa final sin necesidad del indicador -lbar ?


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

Qué 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


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 (Enlace contra la biblioteca estática):

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