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).