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?
c++
dll
linker
static-libraries
Sulla
źródło
źródło
Odpowiedzi:
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ć,
LoadLibrary
aby załadować bibliotekę DLL (iFreeLibrary
kiedy skończysz) iGetProcAddress
uzyskać 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ć.źródło
Przydała mi się również następująca odpowiedź Hansa, która wyjaśnia, że mogą istnieć dwa typy plików lib.
źródło
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:
źródło
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.
źródło
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.
źródło