Verknüpfung mit einer dynamischen Bibliothek mit Abhängigkeiten
Stellen Sie sich das folgende Szenario vor:
Shared Library libA.so, ohne Abhängigkeiten.Shared Library libB.so mit libA.so als Abhängigkeit.Ich möchte eine Binärdatei kompilieren, die mit der libB verknüpft ist. Soll ich die Binärdatei nur mit libB oder auch mit libA verknüpfen?
Gibt es eine Möglichkeit, nur mit den direkten Abhängigkeiten zu verknüpfen und die Auflösung von nicht aufgelösten Symbolen aus den Abhängigkeiten zur Laufzeit zuzulassen?
Ich mache mir Sorgen über die Tatsache, dass sich die Implementierung von libB in der Bibliothek in Zukunft möglicherweise ändert und andere Abhängigkeiten einführt (libC, libD, libE zum Beispiel). Werde ich damit Probleme haben?
Mit anderen Worten:
libA-Dateien: a.cpp a.hlibB-Dateien: b.cpp b.hHauptprogrammdateien: main.cppNatürlich enthält b.cpp a.h und main.cpp b.h.
Kompilierungsbefehle:
g++ -fPIC a.cpp -c
g++ -shared -o libA.so a.o
g++ -fPIC b.cpp -c -I.
g++ -shared -o libB.so b.o -L. -lA
Welche der folgenden Optionen soll ich verwenden?
g++ main.cpp -o main -I. -L. -lB
oder
g++ main.cpp -o main -I. -L. -lB -lA
Ich konnte die erste Option nicht verwenden. Der Linker beschwert sich über die nicht aufgelösten Symbole aus der Bibliothek libA. Aber es klingt ein bisschen komisch für mich.
Vielen Dank.
- Aktualisierte Kommentare:
Wenn ich die Binärdatei verknüpfe, versucht der Linker, alle Symbole aus der Haupt- und der libB aufzulösen. LibB hat jedoch undefinierte Symbole aus der libA. Deshalb beschwert sich der Linker darüber.
Deshalb muss ich mich auch mit der libA verbinden. Ich habe jedoch eine Möglichkeit gefunden, nicht aufgelöste Symbole aus gemeinsam genutzten Bibliotheken zu ignorieren. Ich sollte dazu die folgende Befehlszeile verwenden:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Sieht so aus, als ob es immer noch möglich ist, das zu verwenden-rpath
Möglichkeit. Allerdings muss ich es ein bisschen besser verstehen.
Kennt jemand mögliche Fallstricke bei der Benutzung des-Wl,-unresolved-symbols=ignore-in-shared-libs
Möglichkeit?
- Aktualisierte Kommentare 2:
-rpath
sollte nicht für diesen Zweck verwendet werden. Es ist nützlich, das Auffinden einer Bibliothek in einem bestimmten Verzeichnis zu erzwingen. Das-unresolved-symbol
Ansatz sieht viel besser aus.
Danke noch einmal.