Co znajduje się w pliku .lib biblioteki statycznej, biblioteki dynamicznej połączonej statycznie i biblioteki dynamicznej połączonej dynamicznie?


84

Co znajduje się w pliku .lib biblioteki statycznej, biblioteki dynamicznej połączonej statycznie i biblioteki dynamicznej połączonej dynamicznie?

Dlaczego nie jest potrzebny plik .lib w dynamicznie połączonej bibliotece dynamicznej, a także, że w statycznym łączeniu plik .lib jest niczym innym jak plikiem .obj ze wszystkimi metodami. Czy to jest poprawne?


4
Można zauważyć, że pytanie dotyczy platformy MS Windows.
— cubuspl42

Odpowiedzi:


147

W przypadku biblioteki statycznej plik .lib zawiera cały kod i dane biblioteki. Następnie konsolidator identyfikuje potrzebne bity i umieszcza je w końcowym pliku wykonywalnym.

W przypadku biblioteki dynamicznej plik .lib zawiera listę wyeksportowanych funkcji i elementów danych z biblioteki oraz informacje o tym, z której biblioteki DLL pochodzą. Kiedy konsolidator buduje ostateczny plik wykonywalny, to jeśli jest używana którakolwiek z funkcji lub elementów danych z biblioteki, wówczas konsolidator dodaje odwołanie do biblioteki DLL (powodując, że jest ona automatycznie ładowana przez system Windows) i dodaje wpisy do tabeli importu pliku wykonywalnego, więc że wywołanie funkcji jest przekierowywane do tej biblioteki DLL.

Nie potrzebujesz pliku .lib, aby korzystać z biblioteki dynamicznej, ale bez niej nie możesz traktować funkcji z biblioteki DLL jako normalnych funkcji w kodzie. Zamiast tego musisz ręcznie wywołać, LoadLibraryaby załadować bibliotekę DLL (i FreeLibrarykiedy skończysz) i GetProcAddressuzyskać adres funkcji lub elementu danych w bibliotece DLL. Następnie musisz rzutować zwrócony adres na odpowiedni wskaźnik do funkcji, aby go użyć.


4
Po długich poszukiwaniach IMO uzyskałem najlepszą odpowiedź z powodu użycia biblioteki lib & dll. Dzięki
— Jeet,

@Anthony Williams, kiedy powiedziałeś: „W przypadku biblioteki dynamicznej plik .lib zawiera listę wyeksportowanych funkcji i elementów danych z biblioteki oraz informacje o tym, z której biblioteki DLL pochodzą.”, Jest to plik .lib o nazwie „import biblioteka ", która różni się od zwykłych plików .lib (" biblioteka statyczna ")?
— starriet

Tak, to biblioteka importu
— Anthony Williams

13

Przydała mi się również następująca odpowiedź Hansa, która wyjaśnia, że ​​mogą istnieć dwa typy plików lib.

Plik LIB służy do budowania programu, istnieje tylko na komputerze, na którym się budujesz i nie jest wysyłany. Istnieją dwa rodzaje. Biblioteka dołączana statycznie to zbiór plików .obj zebranych w jednym pliku. Konsolidator wybiera dowolne fragmenty kodu z pliku, gdy musi rozwiązać zewnętrzny identyfikator.

Ale bardziej istotne dla bibliotek DLL, plik LIB może być również biblioteką importu. Jest to wtedy prosty, mały plik zawierający nazwę biblioteki DLL i listę wszystkich funkcji wyeksportowanych przez bibliotekę DLL. Będziesz musiał dostarczyć go konsolidatorowi podczas tworzenia programu, który używa biblioteki DLL, aby wiedział, że identyfikator zewnętrzny jest w rzeczywistości funkcją eksportowaną przez bibliotekę DLL. Konsolidator używa biblioteki importu, aby dodać wpisy do tabeli importu dla EXE. To z kolei jest używane przez system Windows w czasie wykonywania, aby dowiedzieć się, jakie biblioteki DLL muszą zostać załadowane, aby uruchomić program.


8

W bibliotece statycznej plik lib zawiera rzeczywisty kod obiektu dla funkcji udostępnianych przez bibliotekę. W wersji udostępnionej (nazywanej statycznie połączoną biblioteką dynamiczną) jest wystarczająco dużo kodu, aby ustanowić połączenie dynamiczne w czasie wykonywania.

Nie jestem pewien co do „dynamicznie połączonych bibliotek dynamicznych” (ładowanych programowo). Czy w takim przypadku w ogóle łączysz się z .lib?

Edytować:

Trochę późno, ale nie, nie łączysz .lib. Cóż, łączysz się z biblioteką z zawartością Libraryloaderex. Ale w przypadku aktualnie używanej biblioteki udostępniasz własne powiązania za pomocą wskaźników funkcji C, a biblioteka loadlibrary je wypełnia.

Oto podsumowanie:

Łączenie ǁ statyczne | DLL | LoadLibrary
========= ǁ =============== | ====================== | = ==================
Kod API ǁ W Twoim com- | W bibliotece DLL | W bibliotece DLL
życia ǁ spiętrzony program | |
--------- ǁ --------------- | ---------------------- | - ------------------
Funkcja ǁ Bezpośrednia, może | Pośrednio przez stół | Pośrednio przez twój
rozmowy ǁ zostać wyeliminowane | wypełniane automatycznie | własna funkcja ptrs
--------- ǁ --------------- | ---------------------- | - ------------------
Burden ǁ kompilator | Kompilator / system operacyjny | Ty / OS

przez biblioteki połączone statycznie, mam na myśli używanie pliku .lib i łączenie .dll w czasie kompilacji. Łączenie dynamiczne polega na łączeniu pliku .dll w czasie wykonywania przy użyciu funkcji libraryloaderex () interfejsu API Win32.
— Sulla

6

Pliki lib są odczytywane przez konsolidator, a podczas wykonywania używany jest plik dll. Plik lib jest zasadniczo bezużyteczny podczas wykonywania, a konsolidator nie jest w stanie odczytać pliku dll (z wyjątkiem być może w sposób nieistotny tutaj).

Różnice między użyciem plików lib do łączenia statycznego i dynamicznego mogą być mylące, ale jeśli zrozumiesz trochę historii, stanie się to bardzo jasne.

Pierwotnie istniały tylko biblioteki statyczne. W przypadku biblioteki statycznej plik .lib zawiera pliki obj. Każdy plik obj jest wynikiem jednego i tylko jednego pliku wejściowego kodu źródłowego kompilatora. Plik lib to po prostu zbiór powiązanych plików obj, podobnie jak umieszczanie plików obj w katalogu. To właśnie jest plik lib, biblioteka plików obj. W przypadku łącza statycznego wszystkie pliki obj, których używa plik wykonywalny, są łączone w jeden plik. Porównaj to z łączem dynamicznym, w którym plik wykonywalny znajduje się w innym pliku niż inny używany przez niego kod.

Aby zaimplementować łączenie dynamiczne, firma Microsoft zmodyfikowała użycie plików lib tak, aby odwoływały się do pliku dll zamiast lokalizacji w pliku obj. Poza tym wszystkie informacje zawarte w bibliotece dla łącza statycznego są takie same, jak dla łącza dynamicznego. Wszystkie są takie same, jeśli chodzi o zawarte w nich informacje, z wyjątkiem tego, że plik lib dla łącza dynamicznego określa plik dll.


1

W bibliotekach dll są „rzeczy” takie jak w exe (mogą być dowolne dane, importy, eksporty, sekcje odczytu / zapisu / wykonywalne), ale różnica polega na tym, że plik exe eksportuje tylko punkt wejścia (funkcję), ale plik dll eksportuje / wiele funkcji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.