Różnica między bibliotekami statycznymi a współdzielonymi?

Jaka jest różnica między bibliotekami statycznymi a współdzielonymi?

Używam Eclipse i jest kilka typów projektów, w tym Biblioteki statyczne i biblioteki współdzielone? Czy jeden ma przewagę nad drugim?

Author: Mohit Deshpande, 2010-04-16

7 answers

Biblioteki współdzielone to .so (lub w Windows .dll, lub w OS X .dylib) pliki. Cały kod odnoszący się do biblioteki znajduje się w tym pliku i jest odwoływany przez programy używające go w czasie wykonywania. Program korzystający z biblioteki współdzielonej odwołuje się tylko do kodu, którego używa w bibliotece współdzielonej.

Biblioteki statyczne są .a (lub w Windows .lib) pliki. Cały kod odnoszący się do biblioteki znajduje się w tym pliku i jest bezpośrednio połączony z programem podczas kompilacji. Program wykorzystujący statyczny biblioteka pobiera kopie kodu, którego używa ze statycznej biblioteki i czyni go częścią programu. [Windows ma również .pliki lib, które są używane do odniesienia .pliki dll, ale działają tak samo jak pierwsze].

Istnieją zalety i wady każdej metody.

Biblioteki współdzielone zmniejszają ilość kodu, który jest duplikowany w każdym programie, który korzysta z biblioteki, zachowując małe ilości plików binarnych. Umożliwia również zastąpienie współdzielonego obiektu takim, który jest funkcjonalnie równoważny, ale mógł mieć dodatkowe korzyści wydajnościowe bez konieczności rekompilowania programu, który z niego korzysta. Biblioteki współdzielone będą jednak ponosiły niewielki dodatkowy koszt wykonania funkcji, a także koszt ładowania w czasie pracy, ponieważ wszystkie symbole w bibliotece muszą być podłączone do rzeczy, których używają. Dodatkowo biblioteki współdzielone mogą być ładowane do aplikacji w czasie działania, co jest ogólnym mechanizmem implementacji wtyczki binarnej systemy.

Biblioteki statyczne zwiększają całkowity Rozmiar pliku binarnego, ale oznacza to, że nie trzeba nosić ze sobą kopii biblioteki, która jest używana. Ponieważ kod jest podłączony podczas kompilacji, nie ma żadnych dodatkowych kosztów ładowania. Kod jest po prostu tam.

Osobiście wolę biblioteki współdzielone, ale używam bibliotek statycznych, gdy trzeba upewnić się, że plik binarny nie ma wielu zewnętrznych zależności, które mogą być trudne do spełnienia, takich jak specyficzne wersje biblioteki standardowej C++ lub konkretne wersje biblioteki Boost C++.

 648
Author: Petesh,
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-08-22 17:03:44

Statyczna Biblioteka jest jak Księgarnia, a wspólna Biblioteka jest jak... biblioteka. Z tą pierwszą otrzymujesz własną kopię książki / funkcji do domu; z tą drugą ty i wszyscy inni udacie się do biblioteki, aby użyć tej samej książki / funkcji. Więc każdy, kto chce korzystać z (udostępnionej) biblioteki, musi wiedzieć, gdzie ona jest, ponieważ musisz "iść po" książkę / funkcję. Dzięki statycznej bibliotece książka / funkcja jest twoja i przechowujesz ją w swoim domu/programie, a gdy już ją masz, możesz nie obchodzi mnie, gdzie i kiedy go masz.

 341
Author: Paul Richter,
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
2011-10-26 04:36:57

Uproszczone:

  • Statyczne linkowanie: jeden duży plik wykonywalny
  • dynamiczne łączenie: mały plik wykonywalny plus jeden lub więcej plików bibliotecznych (.pliki dll Na Windows,. so na Linuksie, lub .dylib na macOS)
 53
Author: StackedCrooked,
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-08-31 16:23:32

Biblioteki statyczne są kompilowane jako część aplikacji, podczas gdy biblioteki współdzielone nie są. Kiedy rozpowszechniasz aplikację, która zależy od współdzielonych bibliotek, np. biblioteki dll na MS Windows muszą być zainstalowane.

Zaletą bibliotek statycznych jest to, że nie są wymagane żadne zależności od użytkownika uruchamiającego aplikację - np. nie muszą aktualizować swoich bibliotek DLL czegokolwiek... Wadą jest to, że aplikacja jest większy rozmiar, ponieważ wysyłasz to ze wszystkimi bibliotekami, których potrzebuje.

Oprócz tworzenia mniejszych aplikacji, biblioteki współdzielone oferują użytkownikowi możliwość korzystania z własnej, być może lepszej wersji bibliotek, a nie polegania na jednej, która jest częścią aplikacji

 28
Author: Tarski,
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
2010-04-15 22:17:27

Dla biblioteki statycznej, kod jest wydobywany z biblioteki przez łącznik i używany do budowania ostatecznego pliku wykonywalnego w momencie kompilacji/budowania aplikacji. Ostateczny plik wykonywalny nie ma zależności od biblioteki w czasie wykonywania

W przypadku biblioteki współdzielonej kompilator / linker sprawdza, czy nazwy, z którymi łączysz, istnieją w bibliotece, gdy aplikacja jest budowana, ale nie przenosi ich kodu do aplikacji. W czasie działania biblioteka współdzielona musi być dostępny.

Sam język programowania C nie ma pojęcia ani o bibliotekach statycznych, ani dzielonych - są one całkowicie implementacją.

Osobiście wolę używać bibliotek statycznych, ponieważ ułatwia to dystrybucję Oprogramowania. Jest to jednak opinia, nad którą w przeszłości przelano wiele (symbolicznej) krwi.

 26
Author: ,
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
2010-04-15 22:13:00

Największą 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 dołączone do Twojej aplikacji. Więc nie musisz się martwić, że klient będzie miał odpowiednią bibliotekę (i wersję) dostępną w swoim systemie.

 16
Author: Jasmeet,
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
2010-04-16 08:08:36

Poza wszystkimi innymi odpowiedziami, jedna rzecz, o której jeszcze nie wspomnieliśmy, to odsprzęganie:

Pozwólcie, że powiem o kodzie produkcyjnym z prawdziwego świata,z którym miałem do czynienia:

Bardzo duży program, składający się z >300 projektów (z visual studio), zbudowany głównie jako statyczny lib i ostatecznie wszystkie łącza razem w jednym ogromnym pliku wykonywalnym, kończy się następującymi problemami:

- Czas połączenia jest bardzo długi. Możesz skończyć o więcej niż 15min linku, powiedzmy 10s kompilacji czas - Niektóre narzędzia są na kolanach z tak dużym wykonywalnym, jak narzędzia do sprawdzania pamięci, które muszą instrumentować kod. Możesz wpaść w granice, które uważano za głupców.

Bardziej problematyczne jest oddzielenie Twojego oprogramowania : na tym prawdziwym przykładzie, pliki nagłówków każdego projektu były dostępne od innych projektów. W konsekwencji bardzo łatwo było jednemu programiście dodać zależności; chodziło tylko o włączenie nagłówka, ponieważ link na końcu będzie / align = "left" / Kończy się strasznymi zależnościami rowerowymi i kompletnym bałaganem.

Z biblioteką współdzieloną jest to trochę dodatkowej pracy, ponieważ programista musi edytować system budowania projektu, aby dodać bibliotekę zależną. Zauważyłem, że kod biblioteki współdzielonej ma tendencję do oferowania czystszego API kodu.

 3
Author: sandwood,
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-10-30 14:36:46