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?

Sulla
źródło
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ć.

Anthony Williams
źródło
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.

tęczówka
źródło
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
Tryb
źródło
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.

user34660
źródło
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.

Quonux
źródło