GNU/Linux >> Tutoriales Linux >  >> Linux

Vincular una biblioteca compartida con otra biblioteca compartida en Linux

Al intentar crear mi propia biblioteca compartida que usa Berkeley DB, descubrí que tenía que poner -ldb al final del comando gcc o, de lo contrario, explotaba diciendo que no se encontró el símbolo 'db_create'. Esto fue bajo Cygwin.

Específicamente, esto funcionó:

gcc -shared -o $b/$libfile nt_*.o -ldb

Esto no funcionó:

gcc -ldb -shared -o $b/$libfile nt_*.o


Supongamos que libabc.so se obtiene de archivos de código de objeto independientes de la posición abc1.pic.o y abc2.pic.o; entonces los has construido con, por ejemplo,

 gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
 gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o

y construyes libabc.so con

gcc -shared  abc1.pic.o  abc2.pic.o -L/usr/local/lib -l123 -o libabc.so

Lea también la biblioteca de programas HowTo.

Como ves, puedes vincular una biblioteca compartida lib123.so en tu propia biblioteca compartida libabc.so

Luego verifique con ldd libabc.so

Es posible que desee configurar algún rpath en su libabc.so agregando -Wl,-rpath y -Wl,$RPATHDIR al comando de vinculación.

Para obtener más detalles, lea el artículo de Drepper Cómo escribir bibliotecas compartidas

PD. No use una biblioteca estática para lib123.a (debería ser PIC). Si vincula un código que no es PIC en un objeto compartido, pierde la mayoría de las ventajas de los objetos compartidos y el vinculador dinámico ld.so tiene que hacer millones de reubicaciones.


Siguiendo el mismo procedimiento señalado por Basile Starynkevitch, por ejemplo, tengo una biblioteca que depende de libm.so , por lo que la compilación de los objetos de la biblioteca es:

gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c  -o build/arm/wavegen.o                                                                                          
gcc -fPIC -Wall -g -I include -I src -c src/serial.c  -o build/arm/serial.o

Sin embargo, para compilar la biblioteca, en algunas versiones de gcc, el orden en que se colocan las referencias de la biblioteca es importante, por lo que sugiero, para garantizar la compatibilidad, colocar esas referencias al final del comando:

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

He probado en PC (gcc v.8.3.0) y en ARM (gcc v.4.6.3).


Linux
  1. Introducción a las bibliotecas compartidas de Linux (Cómo crear bibliotecas compartidas)

  2. Biblioteca compartida dinámica de C++ en Linux

  3. Compilación de biblioteca compartida dinámica con g ++

  4. Enlace estático de función de biblioteca compartida en gcc

  5. vinculando <iostream.h> en Linux usando gcc

Instalar Linux con LVM

Reemplace du con polvo en Linux

Comando wc Linux con ejemplos

Comando ip de Linux con ejemplos

15 comandos ps de Linux con ejemplos

¿Cómo copio una carpeta con archivos a otra carpeta en Unix/Linux?