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. Sollte ich die Binärdatei nur mit libB oder entweder mit libA verknüpfen?
Gibt es eine Möglichkeit, nur mit den direkten Abhängigkeiten zu verknüpfen und die Auflösung nicht aufgelöster Symbole aus den Abhängigkeiten zur Laufzeit zu ermöglichen?
Ich mache mir Sorgen darüber, dass sich die libB-Implementierung der Bibliothek in Zukunft ändern und andere Abhängigkeiten einführen könnte (z. B. libC, libD, libE). Werde ich damit Probleme haben?
Mit anderen Worten:
- libA-Dateien: a.cpp ah
- libB-Dateien: b.cpp bh
- Hauptprogrammdateien: main.cpp
Natürlich enthält b.cpp ah und main.cpp bh
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 sollte 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 ungelösten Symbole aus der Bibliothek libA. Aber es klingt ein bisschen seltsam 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 einen Weg gefunden, ungelöste Symbole aus gemeinsam genutzten Bibliotheken zu ignorieren. Sieht so aus, als ob ich die folgende Befehlszeile verwenden sollte, um das zu tun:
g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs
Es sieht so aus, als ob es immer noch möglich ist, die -rpath
Option zu verwenden. Allerdings muss ich es etwas besser verstehen.
Kennt jemand mögliche Fallstricke bei der Verwendung der -Wl,-unresolved-symbols=ignore-in-shared-libs
Option?
- Aktualisierte Kommentare 2:
-rpath
sollte nicht für diesen Zweck verwendet werden. Es ist nützlich, zu erzwingen, dass eine Bibliothek in einem bestimmten Verzeichnis gefunden wird. Der -unresolved-symbol
Ansatz sieht viel besser aus.
Danke noch einmal.