C Academy · Lekcja

Biblioteki statyczne i współdzielone

Budowanie i linkowanie bibliotek

Lekcja 4 z 413 kroki

Biblioteki statyczne i współdzielone to bezpłatna lekcja C Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 4 lekcji w sumie.

Czym jest biblioteka

Biblioteka to zbiór skompilowanych plików obiektowych, które można ponownie wykorzystywać w różnych programach bez każdorazowego ponownego kompilowania kodu źródłowego.

W języku C występują dwa rodzaje bibliotek:

  • biblioteki statyczne (.a), kopiowane do pliku wykonywalnego podczas konsolidacji
  • biblioteki współdzielone (.so), ładowane w czasie wykonywania

Budowanie plików obiektowych

Oba rodzaje bibliotek zaczynają się od plików obiektowych. Należy jak zwykle skompilować pliki źródłowe z opcją -c.

Te pliki .o stanowią surowiec, który archiwizator lub konsolidator zapakuje do biblioteki.

gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.o

Tworzenie biblioteki statycznej

Archiwizator ar łączy pliki obiektowe w archiwum .a. Konwencjonalna nazwa to lib<name>.a.

Flagi oznaczają: r — wstaw, c — utwórz w razie potrzeby, s — zapisz indeks.

ar rcs libmymath.a mathlib.o strlib.o

Konsolidowanie biblioteki statycznej

Do konsolidacji należy użyć -L do wskazania katalogu wyszukiwania oraz -l do wskazania nazwy biblioteki (należy pominąć prefiks lib i przyrostek .a).

Potrzebny kod jest kopiowany do pliku wykonywalnego, który może następnie działać samodzielnie.

gcc main.c -L. -lmymath -o app

Kompromisy bibliotek statycznych

Konsolidowanie statyczne jest proste i samowystarczalne:

  • Plik wykonywalny zawiera wszystko, więc nie ma zależności w czasie wykonywania
  • Jednak każdy program przechowujący własną kopię ma większy rozmiar
  • Naprawa błędu w bibliotece wymaga ponownej konsolidacji każdego programu, który z niej korzysta

Kod niezależny od położenia

Biblioteki współdzielone mogą być ładowane pod dowolny adres pamięci, dlatego ich kod musi być niezależny od położenia. Należy kompilować go z opcją -fPIC.

Powoduje to wygenerowanie kodu używającego adresowania względnego zamiast stałych adresów.

gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.o

Tworzenie biblioteki współdzielonej

Plik .so należy zbudować z opcją -shared. Konwencjonalna nazwa to lib<name>.so.

W przeciwieństwie do archiwum statycznego jest to rzeczywiście skonsolidowany obiekt, który program ładujący może odwzorować w pamięci podczas działania programu.

gcc -shared mathlib.o strlib.o -o libmymath.so

Konsolidowanie biblioteki współdzielonej

Konsolidowanie wygląda tak samo jak w przypadku biblioteki statycznej. Różnica polega na tym, że kod nie jest kopiowany do pliku wykonywalnego — zapisywane jest tylko odwołanie.

Plik wykonywalny pozostaje mały, ale od tej pory wymaga znalezienia libmymath.so w czasie wykonywania.

gcc main.c -L. -lmymath -o app

Znajdowanie biblioteki w czasie wykonywania

Podczas uruchamiania dynamiczny program ładujący przeszukuje standardowe ścieżki w poszukiwaniu pliku .so. Biblioteka w bieżącym katalogu nie znajduje się na tej liście.

Do testów można wskazać ją programowi ładującemu za pomocą LD_LIBRARY_PATH (Linux).

LD_LIBRARY_PATH=. ./app

Kompromisy bibliotek współdzielonych

Biblioteki współdzielone zamieniają prostotę na elastyczność:

  • Jedna kopia w pamięci jest współdzielona przez wiele programów, co oszczędza pamięć RAM i miejsce na dysku
  • Naprawa błędu w pliku .so przynosi korzyść każdemu programowi bez ponownej konsolidacji
  • Program nie uruchomi się jednak, jeśli pliku .so brakuje lub jest niezgodny

To ostatnie zagrożenie jest klasycznym przykładem „dependency hell”, czyli piekła zależności.

Sprawdzanie zależności

Dwa narzędzia pomagają sprawdzić, z czym konsolidowany jest plik binarny:

  • ldd app wyświetla biblioteki współdzielone potrzebne programowi ładującemu w czasie wykonywania
  • nm libmymath.a wyświetla symbole (funkcje) znajdujące się w bibliotece

Jeśli ldd wyświetla „not found”, program ładujący nie może znaleźć tego pliku .so na swojej ścieżce wyszukiwania.

ldd app
nm libmymath.a

Szybkie sprawdzenie

Dopasuj flagę do celu.

Podsumowanie

Potrafi już Pan/Pani budować i konsolidować oba rodzaje bibliotek:

  • Statyczne: ar rcs libX.a *.o; kod jest kopiowany do pliku binarnego, który jest samowystarczalny, ale większy
  • Współdzielone: kompilowane z -fPIC, budowane z -shared, a kod ładowany w czasie wykonywania
  • Oba rodzaje konsoliduje się za pomocą -L i -l; biblioteki współdzielone wymagają ścieżki wyszukiwania w czasie wykonywania, takiej jak LD_LIBRARY_PATH

Ma już Pan/Pani kompletny łańcuch narzędzi od preprocesora po budowanie.

Bezpłatny start

Ucz się C dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
144

Często zadawane pytania

Czy lekcja „Biblioteki statyczne i współdzielone” jest bezpłatna?

Tak — pełny tekst „Biblioteki statyczne i współdzielone” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Biblioteki statyczne i współdzielone”?

Budowanie i linkowanie bibliotek Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C Academy?

Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Biblioteki statyczne i współdzielone”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?

Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kompilacja warunkowa
  2. Projekty wieloplikowe
  3. Makefile
  4. Biblioteki statyczne i współdzielone
← Powrót do C Academy