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