Když jsem se pokoušel vytvořit vlastní sdílenou knihovnu, která používá Berkeley DB, zjistil jsem, že musím na konec příkazu gcc umístit -ldb, jinak to prasklo a řeklo, že symbol 'db_create' nebyl nalezen. To bylo za Cygwina.
Konkrétně to fungovalo:
gcc -shared -o $b/$libfile nt_*.o -ldb
Toto nefungovalo:
gcc -ldb -shared -o $b/$libfile nt_*.o
Předpokládejme, že libabc.so
se získává ze souborů s pozičně nezávislým objektovým kódem abc1.pic.o
a abc2.pic.o
; pak jste je postavili pomocí např.
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
a vytvoříte libabc.so
s
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
Přečtěte si také Návod na knihovnu programů.
Jak vidíte, můžete propojit sdílenou knihovnu lib123.so
do vaší vlastní sdílené knihovny libabc.so
Poté zkontrolujte pomocí ldd libabc.so
Možná budete chtít nastavit nějakou rpath v libabc.so
přidáním -Wl,-rpath
a -Wl,$RPATHDIR
k příkazu propojení.
Pro mnohem více podrobností si přečtěte Drepperův článek Jak psát sdílené knihovny
PS. Nepoužívejte statickou knihovnu pro lib123.a
(měl by to být PIC). Pokud propojíte kód bez PIC do sdíleného objektu, ztratíte většinu výhod sdílených objektů a dynamický linker ld.so musí provést miliony přemístění.
Podle stejného postupu, na který poukázal například Basile Starynkevitch, mám knihovnu, která závisí na libm.so
, takže kompilace pro objekty knihovny jsou:
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
Pro kompilaci knihovny je však v některých verzích gcc důležité pořadí, kde jsou odkazy na knihovny umístěny, takže pro zajištění kompatibility doporučuji umístit tyto odkazy na konec příkazu:
gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm
Testoval jsem v PC (gcc v.8.3.0) a v ARM (gcc v.4.6.3).