Jaka jest różnica między bibliotekami statycznymi i współdzielonymi?
Używam Eclipse i istnieje kilka typów projektów, w tym biblioteki statyczne i biblioteki współdzielone? Czy jedna ma przewagę nad drugą?
Jaka jest różnica między bibliotekami statycznymi i współdzielonymi?
Używam Eclipse i istnieje kilka typów projektów, w tym biblioteki statyczne i biblioteki współdzielone? Czy jedna ma przewagę nad drugą?
Odpowiedzi:
Biblioteki współdzielone to pliki .so (lub w .dll systemu Windows lub w .dylib systemu OS X). Cały kod związany z biblioteką znajduje się w tym pliku, a programy używają go w czasie wykonywania. Program korzystający z biblioteki współużytkowanej odnosi się tylko do kodu używanego w bibliotece współużytkowanej.
Biblioteki statyczne to pliki .a (lub w .lib systemu Windows). Cały kod związany z biblioteką znajduje się w tym pliku i jest on bezpośrednio powiązany z programem w czasie kompilacji. Program korzystający z biblioteki statycznej pobiera kopie kodu, którego używa, z biblioteki statycznej i czyni go częścią programu. [Windows ma również pliki .lib, które są używane do odwoływania się do plików .dll, ale działają one tak samo jak pierwszy].
Każda metoda ma zalety i wady:
Biblioteki współdzielone zmniejszają ilość kodu powielanego w każdym programie korzystającym z biblioteki, dzięki czemu pliki binarne są małe. Pozwala także zastąpić współdzielony obiekt tym, który jest funkcjonalnie równoważny, ale może mieć dodatkowe korzyści w zakresie wydajności bez konieczności ponownej kompilacji programu, który z niego korzysta. Udostępniane biblioteki będą jednak wiązały się z niewielkim dodatkowym kosztem wykonania funkcji, a także kosztem ładowania w czasie wykonywania, ponieważ wszystkie symbole w bibliotece muszą być połączone z używanymi przez nich rzeczami. Dodatkowo biblioteki współdzielone mogą być ładowane do aplikacji w czasie wykonywania, co jest ogólnym mechanizmem implementacji binarnych systemów wtyczek.
Biblioteki statyczne zwiększają całkowity rozmiar pliku binarnego, ale oznacza to, że nie trzeba nosić ze sobą kopii używanej biblioteki. Ponieważ kod jest podłączony podczas kompilacji, nie ma żadnych dodatkowych kosztów ładowania w czasie wykonywania. Kod jest po prostu dostępny.
Osobiście wolę biblioteki współdzielone, ale używam bibliotek statycznych, gdy muszę upewnić się, że plik binarny nie ma wielu zewnętrznych zależności, które mogą być trudne do spełnienia, takich jak określone wersje standardowej biblioteki C ++ lub określone wersje biblioteki Boost C ++.
Biblioteka statyczna jest jak księgarnia, a biblioteka współdzielona jest jak ... biblioteka. W pierwszym przypadku otrzymujesz własną kopię książki / funkcji, którą możesz zabrać do domu; z tym ostatnim ty i wszyscy inni idziecie do biblioteki, aby korzystać z tej samej książki / funkcji. Tak więc każdy, kto chce korzystać z (współdzielonej) biblioteki, musi wiedzieć, gdzie ona jest, ponieważ musisz „iść” po książkę / funkcję. Dzięki statycznej bibliotece książka / funkcja należy do ciebie i trzymasz ją w swoim domu / programie, a kiedy już ją posiadasz, nie obchodzi cię, gdzie i kiedy ją masz.
Uproszczony:
W przypadku biblioteki statycznej kod jest wyodrębniany z biblioteki przez konsolidator i używany do zbudowania ostatecznego pliku wykonywalnego w punkcie kompilacji / kompilacji aplikacji. Ostateczny plik wykonywalny nie ma zależności od biblioteki w czasie wykonywania
W przypadku biblioteki współużytkowanej kompilator / linker sprawdza, czy nazwy, które łączysz, istnieją w bibliotece podczas budowania aplikacji, ale nie przenosi ich kodu do aplikacji. W czasie wykonywania biblioteka współdzielona musi być dostępna.
Sam język programowania C nie ma pojęcia bibliotek statycznych ani współdzielonych - są one całkowicie funkcją implementacyjną.
Osobiście wolę używać bibliotek statycznych, ponieważ upraszcza to dystrybucję oprogramowania. Jest to jednak opinia, w stosunku do której w przeszłości przelano wiele (symbolicznej) krwi.
Biblioteki statyczne są kompilowane jako część aplikacji, podczas gdy biblioteki współdzielone nie są. Gdy dystrybuujesz aplikację zależną od współdzielonych bibliotek, biblioteki, np. biblioteki dll w MS Windows muszą być zainstalowane.
Zaletą bibliotek statycznych jest to, że użytkownik uruchamiający aplikację nie wymaga żadnych zależności - np. Nie musi aktualizować swojej biblioteki DLL. Wadą jest to, że twoja aplikacja jest większa, ponieważ dostarczasz ją ze wszystkimi potrzebnymi bibliotekami.
Oprócz udostępniania mniejszych aplikacji, biblioteki współdzielone oferują użytkownikowi możliwość korzystania z ich własnych, być może lepszych wersji bibliotek, zamiast polegać na jednej, która jest częścią aplikacji
Najważniejszą zaletą bibliotek współdzielonych jest to, że w pamięci jest załadowana tylko jedna kopia kodu, bez względu na to, ile procesów korzysta z biblioteki. W przypadku bibliotek statycznych każdy proces otrzymuje własną kopię kodu. Może to prowadzić do znacznego marnowania pamięci.
OTOH, zaletą bibliotek statycznych jest to, że wszystko jest zawarte w twojej aplikacji. Więc nie musisz się martwić, że klient będzie miał odpowiednią bibliotekę (i wersję) dostępną w swoim systemie.
.so
pliki w systemach * nix są rodzajem biblioteki współdzielonej (dynamicznej).
Oprócz wszystkich innych odpowiedzi, jedna jeszcze nie wspomniana sprawa to oddzielenie:
Pozwólcie, że powiem o kodzie produkcyjnym w świecie rzeczywistym, z którym miałem do czynienia:
Bardzo duże oprogramowanie, złożone z> 300 projektów (ze studiem wizualnym), zbudowane głównie jako statyczna biblioteka lib, a na końcu wszystkie połączone w jeden wielki plik wykonywalny, możesz mieć następujące problemy:
-Link czas jest bardzo długi. Możesz skończyć z ponad 15 minutami łącza, powiedzmy 10s czasu kompilacji - niektóre narzędzia są na kolanach z tak dużym plikiem wykonywalnym, jak narzędzia do sprawdzania pamięci, które muszą instrumentować kod. Możesz osiągnąć granice, które uważano za głupców.
Bardziej problematyczne jest oddzielenie oprogramowania: na tym prawdziwym przykładzie pliki nagłówków każdego projektu były dostępne dla innych projektów. W rezultacie jeden programista bardzo łatwo dodał zależności; chodziło tylko o włączenie nagłówka, ponieważ link na końcu pozwoli znaleźć symbole. Kończy się to okropnymi zależnościami rowerowymi i kompletnym bałaganem.
W przypadku biblioteki współdzielonej jest to trochę dodatkowa praca, ponieważ programista musi edytować system kompilacji projektu, aby dodać bibliotekę zależną. Zauważyłem, że kod współdzielonej biblioteki oferuje czystszy kod API.
-------------------------------------------------------------------------
| +- | Shared(dynamic) | Static Library (Linkages) |
-------------------------------------------------------------------------
|Pros: | less memory use | an executable, using own libraries|
| | | ,coming with the program, |
| | | doesn't need to worry about its |
| | | compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of | bigger memory uses |
| | libraries may be altered | |
| | subject to OS and its | |
| | version, which may affect| |
| | the compilebility and | |
| | runnability of the code | |
-------------------------------------------------------------------------