Rozważ następujący scenariusz:
- Biblioteka współdzielona libA.so, bez zależności.
- Biblioteka współdzielona libB.so, z libA.so jako zależnością.
Chcę skompilować plik binarny, który łączy się z biblioteką libB. Czy powinienem połączyć plik binarny tylko z libB, czy też z libA?
Czy istnieje sposób na połączenie tylko z bezpośrednimi zależnościami, pozwalając na rozwiązanie nierozwiązanych symboli z zależności w czasie wykonywania?
Martwi mnie fakt, że implementacja biblioteki libB może się w przyszłości zmienić, wprowadzając inne zależności (na przykład libC, libD, libE). Czy będę miał z tym problemy?
Innymi słowy:
- Pliki libA: a.cpp ah
- Pliki libB: b.cpp bh
- główne pliki programu: main.cpp
Oczywiście b.cpp zawiera ah, a main.cpp zawiera bh
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órych z poniższych opcji powinienem użyć?
g++ main.cpp -o main -I. -L. -lB
lub
g++ main.cpp -o main -I. -L. -lB -lA
Nie mogłem skorzystać z pierwszej opcji. Linker skarży się na nierozwiązane symbole z biblioteki libA. Ale to brzmi dla mnie trochę dziwnie.
Dziękuję bardzo.
- Zaktualizowane komentarze:
Kiedy łączę plik binarny, konsolidator spróbuje rozwiązać wszystkie symbole z main 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 ignorowanie nierozwiązanych symboli z bibliotek współdzielonych. 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 skorzystać z tej -rpath
opcji. Jednak muszę to trochę lepiej zrozumieć.
Czy ktoś zna możliwe pułapki podczas korzystania z tej -Wl,-unresolved-symbols=ignore-in-shared-libs
opcji?
- Zaktualizowano komentarze 2:
-rpath
nie powinny być używane do tego celu. Przydatne jest wymuszenie znalezienia biblioteki w podanym katalogu. -unresolved-symbol
Podejście wygląda o wiele lepiej.
Dzięki jeszcze raz.