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