Łączenie z biblioteką dynamiczną z zależnościami

Rozważmy następujący scenariusz:

Udostępniona biblioteka libA.so bez zależności.Biblioteka współdzielona libB.so z libA.so jako jej zależnością.

Chcę skompilować plik binarny, który łączy się z libB. Czy powinienem połączyć binarny tylko z libB lub z libA?

Czy jest jakiś sposób na powiązanie tylko z bezpośrednimi zależnościami, pozwalając na rozwiązanie nierozwiązanych symboli z zależności dla środowiska wykonawczego?

Obawiam się, że implementacja biblioteki libB może się zmienić w przyszłości, wprowadzając inne zależności (na przykład libC, libD, libE). Czy mam z tym problemy?

Innymi słowy:

pliki libA: a.cpp a.hpliki libB: b.cpp b.hgłówne pliki programu: main.cpp

Oczywiście b.cpp zawiera a.h, a main.cpp zawiera b.h.

Polecenia kompilacji:

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

Którego z poniższych opcji należy użyć?

g++ main.cpp -o main -I. -L. -lB

lub

g++ main.cpp -o main -I. -L. -lB -lA

Nie mogłem użyć pierwszej opcji. Linker skarży się na nierozwiązane symbole z biblioteki libA. Ale brzmi to dla mnie trochę dziwnie.

Dziękuję bardzo.

- Zaktualizowane komentarze:

Kiedy łączę plik binarny, linker spróbuje rozwiązać wszystkie symbole z głównego i libB. Jednak libB ma niezdefiniowane symbole z libA. Dlatego linker narzeka na to.

Dlatego też muszę połączyć się z libA. Jednak znalazłem sposób na zignorowanie nierozwiązanych symboli ze współdzielonych bibliotek. Wygląda na to, że powinienem użyć następującego wiersza poleceń, aby to zrobić:

g++ main.cpp -o main -I. -L. -lB -Wl,-unresolved-symbols=ignore-in-shared-libs

Wygląda na to, że nadal można korzystać z-rpath opcja. Jednak muszę to trochę lepiej zrozumieć.

Czy ktoś zna jakiekolwiek możliwe pułapki podczas korzystania z-Wl,-unresolved-symbols=ignore-in-shared-libs opcja?

- Zaktualizowane komentarze 2:

-rpath nie powinny być używane do tego celu. Przydatne jest wymuszenie znalezienia biblioteki w danym katalogu. The-unresolved-symbol podejście wygląda znacznie lepiej.

Dzięki jeszcze raz.

questionAnswers(4)

yourAnswerToTheQuestion