Brałem udział w debacie dotyczącej bibliotek w systemie Linux i chciałbym potwierdzić pewne rzeczy.
W moim rozumieniu (popraw mnie, jeśli się mylę, a później zmodyfikuję swój post), istnieją dwa sposoby korzystania z bibliotek podczas tworzenia aplikacji:
- Biblioteki statyczne (pliki .a): W czasie łączenia kopia całej biblioteki jest umieszczana w końcowej aplikacji, dzięki czemu funkcje w bibliotece są zawsze dostępne dla aplikacji wywołującej
- Obiekty współdzielone (pliki .so): W czasie łączenia obiekt jest właśnie weryfikowany pod kątem interfejsu API za pomocą odpowiedniego pliku nagłówka (.h). Biblioteka nie jest używana do czasu uruchomienia, gdy jest potrzebna.
Oczywistą zaletą bibliotek statycznych jest to, że pozwalają one na samodzielne zamknięcie całej aplikacji, natomiast zaletą bibliotek dynamicznych jest to, że plik „.so” można zastąpić (tj. W przypadku konieczności aktualizacji ze względu na bezpieczeństwo błąd) bez konieczności ponownej kompilacji aplikacji podstawowej.
Słyszałem, że niektórzy ludzie rozróżniają obiekty współdzielone od dynamicznie połączonych bibliotek (DLL), mimo że oba są plikami „.so”. Czy istnieje rozróżnienie między obiektami współdzielonymi a bibliotekami DLL, jeśli chodzi o tworzenie C / C ++ w systemie Linux lub innym systemie operacyjnym zgodnym z POSIX (tj. MINIX, UNIX, QNX itp.)? Powiedziano mi, że jedną kluczową różnicą (jak dotąd) jest to, że obiekty współdzielone są właśnie używane w czasie wykonywania, podczas gdy biblioteki DLL muszą być najpierw otwarte za pomocą wywołania dlopen () w aplikacji.
Na koniec słyszałem też, jak niektórzy programiści wspominali o „udostępnianych archiwach”, które, moim zdaniem, są również bibliotekami statycznymi, ale nigdy nie są używane przez aplikację bezpośrednio. Zamiast tego inne biblioteki statyczne połączą się z „współdzielonymi archiwami”, aby pobrać niektóre (ale nie wszystkie) funkcje / zasoby ze współdzielonego archiwum do budowanej biblioteki statycznej.
Z góry dziękuję wszystkim za pomoc.
Aktualizacja
W kontekście, w którym te warunki zostały mi przekazane, były to faktycznie błędne terminy używane przez zespół programistów Windows, którzy musieli nauczyć się Linuksa. Próbowałem je poprawić, ale (nieprawidłowe) normy językowe utknęły.
- Obiekt współdzielony: biblioteka, która jest automatycznie łączona z programem podczas uruchamiania programu i istnieje jako samodzielny plik. Biblioteka jest dołączana do listy linków w czasie kompilacji (tj .:
LDOPTS+=-lmylib
dla pliku biblioteki o nazwiemylib.so
). Biblioteka musi być obecna w czasie kompilacji i podczas uruchamiania aplikacji. - Biblioteka statyczna: biblioteka, która jest scalana z samym programem w czasie kompilacji dla jednej (większej) aplikacji zawierającej kod aplikacji i kod biblioteki, który jest automatycznie łączony z programem podczas budowania programu, oraz końcowy plik binarny zawierający oba program główny i sama biblioteka istnieje jako pojedynczy autonomiczny plik binarny. Biblioteka jest dołączana do listy linków w czasie kompilacji (np.
LDOPTS+=-lmylib
Dla pliku biblioteki o nazwie mylib.a). Biblioteka musi być obecna w czasie kompilacji. - DLL: Zasadniczo taki sam jak obiekt współdzielony, ale zamiast znajdować się na liście linków w czasie kompilacji, biblioteka jest ładowana za pomocą komend
dlopen()
/dlsym()
, dzięki czemu biblioteka nie musi być obecna w czasie kompilacji, aby program mógł się skompilować. Ponadto biblioteka nie musi być obecna (koniecznie) podczas uruchamiania aplikacji lub podczas kompilacji , ponieważ jest potrzebna tylko w momencie wywołaniadlopen
/dlsym
. - Shared Archive: Zasadniczo taki sam jak biblioteka statyczna, ale jest skompilowany z flagami „export-shared” i „-fPIC”. Biblioteka jest dołączana do listy linków w czasie kompilacji (tj .:
LDOPTS+=-lmylibS
dla pliku biblioteki o nazwiemylibS.a
). Różnica między nimi polega na tym, że ta dodatkowa flaga jest wymagana, jeśli obiekt współdzielony lub biblioteka DLL chce statycznie połączyć udostępnione archiwum ze swoim własnym kodem ORAZ móc udostępnić funkcje w obiekcie współdzielonym innym programom, a nie tylko ich używać wewnętrzny do DLL. Jest to przydatne w przypadku, gdy ktoś udostępnia ci bibliotekę statyczną i chcesz ją przepakować jako SO. Biblioteka musi być obecna w czasie kompilacji.
Dodatkowa aktualizacja
Różnica między „ DLL
” a „ shared library
” była po prostu (leniwym, niedokładnym) kolokwializmem w firmie, w której pracowałem w tym czasie (programiści Windows są zmuszeni przejść na rozwój Linuksa, a termin utknął), zgodnie z opisanymi powyżej opisami.
Dodatkowo, S
literał „ ” po nazwie biblioteki, w przypadku „współdzielonych archiwów” był tylko konwencją stosowaną w tej firmie, a nie w całej branży.
.a
plików „a” oznacza „archove” i jest to po prostu archiwum plików obiektowych. Nowoczesne konsolidatory powinny być na tyle dobre, aby nie trzeba było dołączać biblioteki while, tylko plików obiektów w archiwum, które są potrzebne, a nawet mogą po prostu wykorzystywać sekcje kodu / danych w plikach obiektów, do których się odwołuje.