Czy możliwe są zależności zagnieżdżonej biblioteki statycznej?

12

Pracuję w QT.

  1. Czy biblioteka statyczna może zależeć od innej biblioteki statycznej? (Lib statyczny jest tworzony przez połączenie innej biblioteki statycznej)
  2. Jeśli tak, to czy możliwe jest, że po połączeniu z lib2, wygenerowana lib (lib1) nie będzie zawierała wszystkich kodów lib2?

W moim projekcie Qt używam biblioteki statycznej, która zależy od wielu bibliotek. Musiałem dodać wszystkie biblioteki (ze wszystkimi ich nagłówkami w moim projekcie), chociaż potrzebuję tylko jednej biblioteki lib (i jednej .h tej klasy) w kodzie.

Proszę wyjaśnić scenariusz.

sk patra
źródło

Odpowiedzi:

6

Kiedy deklarujesz coś, po prostu obiecujesz, że podczas łączenia będzie ono dostępne i jednoznacznie zidentyfikowane. Biblioteki statyczne to nic innego jak kontenery dla definicji w formacie wykraczającym poza standard. Ma to następujące konsekwencje:

1) Nie do końca rozumiem, o co tu pytasz, ale jedna biblioteka statyczna może bardzo zależeć od innej biblioteki statycznej. Albo obiecasz, że definicje tej biblioteki będą dostępne podczas końcowego etapu łączenia twojego pliku wykonywalnego (podając ją jako zależność łącza). Lub „scalasz” go podczas łączenia statycznej biblioteki lib.

2) Odpowiedź na to staje się wtedy, że jedyną rzeczą, którą musisz zrobić, to po prostu nie łączyć w lib2 podczas łączenia lib1.

Ogólnie rzecz biorąc, najlepsze podejście z mojego doświadczenia polega na łączeniu tylko bibliotek prywatnych, ponieważ w przeciwnym razie klienci napotkają naruszenia wielu zdefiniowanych symboli, gdy inne części ich projektu będą z Tobą współzależne.

Ylisar
źródło
Oznacza to, że biblioteka statyczna, która zależy od innej biblioteki statycznej, ale zawiera informacje o łączeniu tej biblioteki, JEST MOŻLIWA. Oznacza to, że kiedy muszę dołączyć pierwszą bibliotekę lib do mojego projektu, muszę dołączyć drugą również. Bcoz, pierwsza biblioteka nie zawiera całych kodów drugiej biblioteki. Mam rację?
sk patra
6

Moje dwa krótkie fragmenty na ten temat: 10 (przepraszam, okropny żart).

Aby nieznacznie rozszerzyć, oto:

1- Biblioteka statyczna może zależeć od innej biblioteki statycznej, niczego, a nawet biblioteki dynamicznej: w pierwszych dwóch przypadkach cały kod nowej biblioteki statycznej zostanie włączony do nowej SLL (Biblioteka łączy statycznych), jednak trzecia opcja , w zależności od środowiska może doprowadzić do uzyskania przez SLL jednego z następujących rezultatów,

  • zawierałby statyczne wersje wymaganego przez siebie kodu zebranego z DLL (Dynamic Link Library)
  • lub, co bardziej okropne, miałbyś bibliotekę statyczną, która po włączeniu do projektu wymagałaby wysyłki z biblioteką DLL, co przerwałoby cały sens statycznego łączenia.

Krótko mówiąc, możesz połączyć bibliotekę statyczną z biblioteką statyczną

2 - jeśli zarówno lib1, jak i lib2 są statyczne, a lib1 zostało połączone z lib2, wówczas cała funkcjonalność lib2 byłaby dostępna w lib1 bez potrzeby dołączania lib2, ponieważ lib2 byłby statycznie powiązany w lib1 (pomyśl rosyjskie lalki z lib2 bycie mniejszym).

W opisywanym scenariuszu w każdym z plików, które musisz dołączyć, musi być dostępna dyskretna funkcjonalność, która nie jest statycznie powiązana, stąd potrzeba wielu plików, w przeciwnym razie będziesz mieć jeden plik do włączenia i wszystko będzie dobrze.

Wykonaj następujące czynności: jeden plik .h z odniesieniami do 6 statycznie połączonych bibliotek: aby uzyskać pełną funkcjonalność, w projekcie musisz uwzględnić 7 plików

przykład włączenia 1

Jedna SLL, która została utworzona z tego pliku .h wymagałaby dołączenia tylko nowej SLL do łączenia w kompilacji:

przykład włączenia 2

Mam nadzieję, że to pomoże i zrozumiałem, o co prosiłeś.

GMasucci
źródło