Łą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.cppOczywiś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.