GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linken einer gemeinsam genutzten Bibliothek mit einer anderen gemeinsam genutzten Bibliothek unter Linux

Als ich versuchte, meine eigene gemeinsam genutzte Bibliothek zu erstellen, die Berkeley DB verwendet, stellte ich fest, dass ich das -ldb an das Ende des gcc-Befehls setzen muss, sonst explodierte es und sagte, das Symbol „db_create“ wurde nicht gefunden. Dies war unter Cygwin.

Insbesondere hat dies funktioniert:

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

Das hat nicht funktioniert:

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


Angenommen, libabc.so wird aus den positionsunabhängigen Objektcodedateien abc1.pic.o erhalten und abc2.pic.o; dann hast du sie z.B. mit

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

und Sie bauen libabc.so mit

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

Lesen Sie auch das Programmbibliothek-HowTo.

Wie Sie sehen, können Sie eine gemeinsam genutzte Bibliothek lib123.so verknüpfen in Ihre eigene gemeinsam genutzte Bibliothek libabc.so

Prüfen Sie dann mit ldd libabc.so

Vielleicht möchten Sie einen rpath in Ihrem libabc.so einrichten durch Hinzufügen von -Wl,-rpath und -Wl,$RPATHDIR zum Verknüpfungsbefehl.

Für viel mehr Details lesen Sie Dreppers Artikel Wie man gemeinsam genutzte Bibliotheken schreibt

PS. Verwenden Sie keine statische Bibliothek für lib123.a (es sollte PIC sein). Wenn Sie Nicht-PIC-Code in ein gemeinsam genutztes Objekt verlinken, verlieren Sie die meisten Vorteile von gemeinsam genutzten Objekten, und der dynamische Linker ld.so muss unzählige Verschiebungen durchführen.


Nach dem gleichen Verfahren, das zum Beispiel von Basile Starynkevitch aufgezeigt wurde, habe ich eine Bibliothek, die von libm.so abhängt , also lautet die Kompilierung für die Bibliotheksobjekte:

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

Um die Bibliothek zu kompilieren, ist jedoch in einigen Versionen von gcc die Reihenfolge, in der Bibliotheksreferenzen platziert werden, wichtig, daher schlage ich vor, um die Kompatibilität sicherzustellen, diese Referenzen am Ende des Befehls zu platzieren:

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

Ich habe in PC (gcc v.8.3.0) und in ARM (gcc v.4.6.3) getestet.


Linux
  1. JQ-Befehl in Linux mit Beispielen

  2. Dynamische Shared Library-Kompilierung mit g++

  3. So initialisieren Sie eine gemeinsam genutzte Bibliothek unter Linux

  4. So verwenden Sie Shared Memory mit Linux in C

  5. Wie wird die Versionierung einer gemeinsam genutzten Bibliothek unter Linux durchgeführt?

Installieren Sie Linux mit LVM

Ersetzen Sie unter Linux du durch Staub

wc Linux-Befehl mit Beispielen

Linux-IP-Befehl mit Beispielen

15 Linux-PS-Befehl mit Beispielen

Was bedeutet Warnung:Das Verknüpfen der gemeinsam genutzten Bibliothek mit der statischen Bibliothek ist nicht portierbar?