Vous êtes sur la page 1sur 2

Biblioteki dynamiczne i statyczne w języku C

Laura Peralta Villegas 


Full-Stack Software Engineer & Graphic Designer

Poznaj biblioteki dynamiczne i statyczne w C oraz dowiedz się, jak ich używać.
 2 min  21.01.2020

Czym jest biblioteka w C? Jest to narzędzie pozwalające na skrócenie czasu kompilacji i zawierające kilka plików obiektów (z rozszerzeniem  .o ), które są
używane jako jeden w czasie fazy linkowania kompilacji.

Biblioteki są zwykle indeksowane, co ułatwia dostęp do symboli (funkcji, zmiennych itp.). Nie są plikami wykonywalnymi. Łączy się je raczej z programami, aby te
mogły działać poprawnie.

Rodzaje bibliotek
Istnieją dwa rodzaje bibliotek w języku C: statyczne i dynamiczne. Podczas gdy biblioteki statyczne zostają połączone z programami w jednym kroku, dynamiczne
łączą się w dwóch. Oba rodzaje mają swoje specyficzne zalety.

Biblioteki statyczne są używane przez program podczas procesu kompilacji. Wszystkie potrzebne symbole są wtedy kopiowane do jego z plików, pozwalając
programowi na samodzielne działanie. Zapotrzebowanie na pamięć jednak wtedy wzrośnie, przez to, że powstały ze skopiowanego kodu. Należy również
pamiętać, że jeśli jakiekolwiek zmiany zostaną wprowadzone w bibliotece po czasie kompilacji, program ten będzie musiał zostać ponownie skompilowany w celu
aktualizacji.

Jeżeli chodzi o dynamiczne biblioteki, to program wymaga referencji do biblioteki, co tworzy silną zależność. Jeśli akurat nie ma żadnej, której można użyć to
możliwe, że uruchomiony program nie będzie działał poprawnie. Zaletą bibliotek dynamiczny jest to, że oszczędzają pamięć i w przypadku zmian w bibliotece nie
muszą być ponownie kompilowane. To dlatego, że są linkowane w czasie działania programu.

W Linux rozszerzenie dla biblioteki statycznej to  .a , a dla biblioteki dynamicznej  .so .

Jak używać bibliotek statycznych?


Podstawowym narzędziem do tworzenia bibliotek statycznych jest  ar , które odnosi się do archiwizatora i może zostać użyte w następujący sposób:
ar rc lib1.a main.o main1.o main2.o

Kiedy  ar  jest poleceniem, flaga  r  każe zmienić bibliotece istniejące pliki na nowe, a flaga  c  tworzy bibliotekę  lib1.a , jeśli ta jeszcze nie istnieje.

Jak wspomniano wcześniej, biblioteki są zwykle indeksowane w celu przyspieszenia wyszukiwania symboli. Niektóre kompilatory robią to automatycznie, ale
można to też zrobić osobno:

ranlib lib1.a

Powyższe polecenie również zaktualizuje bibliotekę, jeżeli coś zostało zmienione.

Aby wyświetlić listę wszystkich plików zawartych w bibliotece, użyj polecenia  nm :

nm lib1.a

Rezultat będzie mniej więcej taki:

main.o
main1.o
main2.o

Aby użyć utworzonej biblioteki, połącz ją z plikiem main.c podczas kompilacji przy użyciu flagi  -L . Flaga ta każe kompilatorowi przejrzeć bieżący katalog wraz ze
standardowymi lokalizacjami bibliotek.

gcc main.c -L lib1.a -o main

Jak używać bibliotek dynamicznych?


Aby utworzyć bibliotekę dynamiczną najpierw należy przygotować wszystkie pliki obiektów kompilując je w następujący sposób:

gcc -fPIC -c *.c

Flaga  -fPIC  włącza generowanie „kodu niezależnego od pozycji”, co jest wymogiem dla bibliotek dynamicznych. Flaga  -c konwertuje natomiast pliki  .c  na
pliki obiektów ( .o ).

Następnie trzeba ponownie wykonać kompilację, aby stworzyć bibliotekę przy użyciu poprzednio skonwertowanych plików obiektów.

gcc -shared -Wl, -soname, libname.so -o libname.so *.o

Aby to wykonać, musimy skompilować bibliotekę razem z programem:

gcc main.c -L. -llibname.so -o executable_file_name

Wreszcie, aby móc uruchomić program, biblioteka musi być zainstalowana w standardowej lokalizacji. Można to zrobić za pomocą zmiennej środowiskowej.

export
LD_LIBRARY_PATH=/full_path_to_your_library_location/libname:$LD_LIBRARY_PATH