Pliki DLL i LIB-co i dlaczego?

Niewiele wiem o bibliotekach DLL i LIB poza tym, że zawierają one istotny kod wymagany do prawidłowego działania programu-biblioteki. Ale dlaczego Kompilatory w ogóle je generują? Czy nie byłoby łatwiej umieścić cały kod w jednym pliku wykonywalnym? A jaka jest różnica między DLL i LIB?

Author: Jeff Atwood, 2009-05-27

5 answers

Istnieją biblioteki statyczne (LIB) i dynamiczne (DLL).

Biblioteki są używane, ponieważ możesz mieć kod, którego chcesz użyć w wielu programach. Na przykład, jeśli piszesz funkcję, która liczy liczbę znaków w łańcuchu, funkcja ta będzie przydatna w wielu programach. Gdy ta funkcja będzie działać poprawnie, nie będziesz musiał przekompilować kodu za każdym razem, gdy go używasz, więc umieścisz kod wykonywalny dla tej funkcji w bibliotece, a linker może Rozpakuj i wstaw skompilowany kod do swojego programu. Biblioteki statyczne są czasami nazywane "archiwami" z tego powodu.

Dynamiczne biblioteki idą o krok dalej. Wydaje się marnotrawstwem mieć wiele kopii funkcji bibliotecznych zajmujących miejsce w każdym z programów. Dlaczego nie mogą udostępnić jednej kopii funkcji? Do tego służą biblioteki dynamiczne. Zamiast budowania kodu biblioteki w programie podczas kompilacji, można go uruchomić, mapując go do program wczytany do pamięci. Wiele programów działających w tym samym czasie, które korzystają z tych samych funkcji, może współdzielić jedną kopię, oszczędzając pamięć. W rzeczywistości można ładować biblioteki dynamiczne tylko w razie potrzeby, w zależności od ścieżki przez kod. Nie ma sensu, aby procedury drukarki zajmowały pamięć, jeśli nie robisz żadnego drukowania. Z drugiej strony oznacza to, że musisz mieć kopię dynamicznej biblioteki zainstalowanej na każdym komputerze, na którym działa twój program. Tworzy to własny zestaw problemy.

Jako przykład, prawie każdy program napisany w ' C ' będzie potrzebował funkcji z biblioteki o nazwie 'C runtime library, chociaż niewiele programów będzie wymagało wszystkich funkcji. Środowisko uruchomieniowe C jest dostępne zarówno w wersji statycznej, jak i dynamicznej, dzięki czemu można określić, której wersji używa program w zależności od konkretnych potrzeb.

 240
Author: Charles E. Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 13:57:58

Innym aspektem jest bezpieczeństwo (zaciemnienie). Gdy fragment kodu zostanie wyodrębniony z głównej aplikacji i umieszczony w "oddzielonej" Bibliotece dynamicznego łącza, łatwiej jest zaatakować, przeanalizować (Inżynieria wsteczna) Kod, ponieważ został odizolowany. Gdy ten sam fragment kodu jest przechowywany w Bibliotece LIB, jest on częścią skompilowanej (połączonej) aplikacji docelowej, a tym samym trudniej jest wyodrębnić (odróżnić) ten fragment kodu od reszty docelowych binariów.

 27
Author: mox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 05:32:27

Jednym z ważnych powodów tworzenia biblioteki DLL/LIB, a nie tylko kompilowania kodu do pliku wykonywalnego, jest ponowne użycie i relokacja. Przeciętna Aplikacja Java lub. NET (na przykład) najprawdopodobniej będzie korzystać z kilku bibliotek innych firm (lub frameworków). O wiele łatwiej i szybciej jest po prostu skompilować z wbudowaną biblioteką, zamiast kompilować cały kod firm trzecich do aplikacji. Kompilowanie kodu do bibliotek zachęca również do dobrych praktyk projektowych, np. projektowania klasy do wykorzystania w różnych typach aplikacji.

 12
Author: Andy White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 02:46:59

DLL jest biblioteką funkcji, które są współdzielone między innymi programami wykonywalnymi. Wystarczy zajrzeć do katalogu windows / system32, a znajdziesz ich dziesiątki. Gdy program tworzy bibliotekę DLL, zwykle tworzy plik lib, tak aby aplikacja*.exe program może rozwiązywać symbole, które są zadeklarowane w DLL.

A .lib jest biblioteką funkcji, które są statycznie powiązane z programem - nie są współdzielone przez inne programy. Każdy program, który łączy się z *.plik lib ma wszystkie kod w tym pliku. Jeśli masz dwa programy A.exe oraz B.exe ten link z C. lib wtedy kazdy A i B bedzie zawierac kod w C. lib.

Sposób tworzenia bibliotek DLL i libs zależy od używanego kompilatora. Każdy kompilator robi to inaczej.

 7
Author: Vinodhini Ramasamy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 12:11:35

Inna różnica polega na wydajności.

Ponieważ DLL jest ładowany w czasie wykonywania przez .exe( s),exe (y) i DLL działają z koncepcją pamięci współdzielonej, a tym samym wydajność jest niska w stosunku do łączenia statycznego.

Z drugiej strony, a .lib jest kodem, który jest połączony statycznie w czasie kompilacji do każdego procesu, który żąda. Stąd .exe (s) będą miały pojedynczą pamięć, zwiększając w ten sposób wydajność procesu.

 2
Author: Girish Reddyvari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 06:33:21