GNU/Linux >> Znalost Linux >  >> Linux

Propojení sdílené knihovny s jinou sdílenou knihovnou v linuxu

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


Linux
  1. JQ Command v Linuxu s příklady

  2. propojení <iostream.h> v linuxu pomocí gcc

  3. Jak udělat verzování sdílené knihovny v Linuxu?

  1. Jak nastavit googleTest jako sdílenou knihovnu v Linuxu

  2. Jak zkopíruji složku se soubory do jiné složky v Unixu/Linuxu?

  3. Jak vytvořit zpoždění sdílené knihovny načtené v systému Linux

  1. Úvod do sdílených knihoven Linuxu (Jak vytvořit sdílené knihovny)

  2. Dynamická sdílená knihovna C++ v systému Linux

  3. Kompilace dynamické sdílené knihovny s g++