Sytuacja kobiet w IT w 2024 roku
21.01.20203 min
Laura Peralta Villegas

Laura Peralta VillegasFull-Stack Software Engineer & Graphic Designer

Biblioteki dynamiczne i statyczne w języku C

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

Biblioteki dynamiczne i statyczne w języku C

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
<p>Loading...</p>