Quando ho provato a creare la mia libreria condivisa che utilizza Berkeley DB, ho scoperto che dovevo inserire -ldb alla fine del comando gcc altrimenti è esploso dicendo che il simbolo 'db_create' non è stato trovato. Questo era sotto Cygwin.
Nello specifico, questo ha funzionato:
gcc -shared -o $b/$libfile nt_*.o -ldb
Questo non ha funzionato:
gcc -ldb -shared -o $b/$libfile nt_*.o
Supponiamo che libabc.so
è ottenuto dai file di codice oggetto indipendenti dalla posizione abc1.pic.o
e abc2.pic.o
; poi li hai costruiti con ad es.
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
e costruisci libabc.so
con
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
Leggi anche il Program Library HowTo.
Come vedi, puoi collegare una libreria condivisa lib123.so
nella tua libreria condivisa libabc.so
Quindi controlla con ldd libabc.so
Potresti voler impostare alcuni rpath nel tuo libabc.so
aggiungendo -Wl,-rpath
e -Wl,$RPATHDIR
al comando di collegamento.
Per ulteriori dettagli, leggi l'articolo di Drepper Come scrivere librerie condivise
PS. Non usare una libreria statica per lib123.a
(dovrebbe essere PIC). Se colleghi codice non PIC a un oggetto condiviso, perdi la maggior parte dei vantaggi degli oggetti condivisi e il linker dinamico ld.so deve eseguire milioni di trasferimenti.
Seguendo la stessa procedura indicata da Basile Starynkevitch, ad esempio, ho una libreria che dipende da libm.so
, quindi la compilazione per gli oggetti della libreria è:
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
Per compilare la libreria, tuttavia, in alcune versioni di gcc l'ordine in cui vengono inseriti i riferimenti alla libreria è importante, quindi suggerisco, per garantire la compatibilità, di inserire tali riferimenti alla fine del comando:
gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm
Ho provato su PC (gcc v.8.3.0) e su ARM (gcc v.4.6.3).