A.1 — Biblioteki statyczne i dynamiczne

A biblioteka to pakiet kodu przeznaczony do ponownego wykorzystania przez wiele programów. Zazwyczaj biblioteka C++ składa się z dwóch części:

  1. Plik nagłówkowy, który definiuje funkcjonalność, jaką biblioteka udostępnia (oferuje) korzystającym z niej programom.
  2. Prekompilowany plik binarny, który zawiera implementację tej funkcjonalności, wstępnie skompilowaną do języka maszynowego.

Niektóre biblioteki mogą być podzielone na wiele plików i/lub mieć wiele plików nagłówkowych.

Biblioteki są prekompilowany z kilku powodów. Po pierwsze, ponieważ biblioteki rzadko się zmieniają, nie trzeba ich często rekompilować. Ponowna kompilacja biblioteki za każdym razem, gdy piszesz program, który z niej korzysta, byłaby stratą czasu. Po drugie, ponieważ prekompilowane obiekty są w języku maszynowym, uniemożliwia to ludziom dostęp do kodu źródłowego lub jego zmianę, co jest ważne dla firm lub osób, które nie chcą udostępniać swojego kodu źródłowego ze względu na własność intelektualną.

Istnieją dwa typy bibliotek: biblioteki statyczne i biblioteki dynamiczne.

A biblioteka statyczna (znana również jako archiwum) składa się z procedur, które są kompilowane i łączone bezpośrednio z programem. Kiedy kompilujesz program korzystający z biblioteki statycznej, cała funkcjonalność biblioteki statycznej, z której korzysta Twój program, staje się częścią pliku wykonywalnego. W systemie Windows biblioteki statyczne mają zazwyczaj rozszerzenie .lib, podczas gdy w systemie Linux biblioteki statyczne mają zazwyczaj rozszerzenie .a (archiwum). Jedną z zalet bibliotek statycznych jest to, że wystarczy rozpowszechnić plik wykonywalny, aby użytkownicy mogli uruchomić program. Ponieważ biblioteka staje się częścią programu, gwarantuje to, że w programie będzie zawsze używana właściwa wersja biblioteki. Ponadto, ponieważ biblioteki statyczne stają się częścią Twojego programu, możesz z nich korzystać tak samo, jak z funkcji, które napisałeś dla własnego programu. Z drugiej strony, ponieważ kopia biblioteki staje się częścią każdego pliku wykonywalnego, który z niej korzysta, może to powodować dużo marnowania miejsca. Biblioteki statycznej również nie można łatwo zaktualizować — aby zaktualizować bibliotekę, należy wymienić cały plik wykonywalny.

A biblioteka dynamiczna (zwana także biblioteką współdzieloną) składa się z procedur, które są ładowane do aplikacji w czasie wykonywania. Kiedy kompilujesz program korzystający z biblioteki dynamicznej, biblioteka nie staje się częścią pliku wykonywalnego — pozostaje oddzielną jednostką. W systemie Windows biblioteki dynamiczne mają zazwyczaj rozszerzenie .dll (biblioteka dołączana dynamicznie), podczas gdy w systemie Linux biblioteki dynamiczne mają zazwyczaj rozszerzenie .so (obiekt współdzielony). Jedną z zalet bibliotek dynamicznych jest to, że wiele programów może współdzielić jedną kopię, co oszczędza miejsce. Być może większą zaletą jest to, że bibliotekę dynamiczną można zaktualizować do nowszej wersji bez wymiany wszystkich plików wykonywalnych, które z niej korzystają.

Ponieważ biblioteki dynamiczne nie są połączone z twoim programem, programy korzystające z bibliotek dynamicznych muszą jawnie ładować bibliotekę dynamiczną i łączyć się z nią. Mechanizm ten może być mylący i sprawia, że ​​interakcja z biblioteką dynamiczną jest niewygodna. Aby ułatwić korzystanie z bibliotek dynamicznych, można użyć biblioteki importu.

An biblioteka importu to biblioteka automatyzująca proces ładowania i korzystania z biblioteki dynamicznej. W systemie Windows zwykle odbywa się to za pośrednictwem małej biblioteki statycznej (.lib) o tej samej nazwie, co biblioteka dynamiczna (.dll). Biblioteka statyczna jest dołączana do programu w czasie kompilacji, dzięki czemu można efektywnie korzystać z funkcjonalności biblioteki dynamicznej tak, jakby była biblioteką statyczną. W systemie Linux plik obiektu współdzielonego (.so) działa zarówno jako biblioteka dynamiczna, jak i biblioteka importu. Większość linkerów może zbudować bibliotekę importu dla biblioteki dynamicznej podczas tworzenia biblioteki dynamicznej.

Instalowanie i używanie bibliotek

Teraz, gdy wiesz już o różnych rodzajach bibliotek, porozmawiajmy o tym, jak faktycznie używać bibliotek w swoim programie. Instalacja biblioteki w C++ zazwyczaj obejmuje 4 kroki:

  1. Pozyskaj bibliotekę. Najlepszą opcją jest pobranie prekompilowanego pakietu dla Twojego systemu operacyjnego (jeśli istnieje), dzięki czemu nie będziesz musiał samodzielnie kompilować biblioteki. Jeśli nie jest on dostępny dla Twojego systemu operacyjnego, będziesz musiał pobrać pakiet zawierający wyłącznie kod źródłowy i samodzielnie go skompilować (co wykracza poza zakres tej lekcji). W systemie Windows biblioteki są zazwyczaj dystrybuowane w postaci plików ZIP. W systemie Linux biblioteki są zazwyczaj dystrybuowane w postaci pakietów (np. .RPM). Twój menedżer pakietów może mieć już na liście niektóre z bardziej popularnych bibliotek (np. SDL), co ułatwia instalację, więc sprawdź je najpierw.
  2. Zainstaluj bibliotekę. W systemie Linux zazwyczaj wiąże się to z wywołaniem menedżera pakietów i pozwoleniem mu na wykonanie całej pracy. W systemie Windows zazwyczaj polega to na rozpakowaniu biblioteki do wybranego katalogu. Zalecamy przechowywanie wszystkich bibliotek w jednym miejscu, aby zapewnić łatwy dostęp. Na przykład użyj katalogu o nazwie C:\Libs i umieść każdą bibliotekę w jej własnym podkatalogu.
  3. Upewnij się, że kompilator wie, gdzie szukać plików nagłówkowych biblioteki. W systemie Windows jest to zazwyczaj podkatalog dołączania katalogu, w którym zainstalowałeś pliki bibliotek (np. jeśli zainstalowałeś bibliotekę w C:\libs\SDL-1.2.11, pliki nagłówkowe prawdopodobnie znajdują się w C:\libs\SDL-1.2.11\include). W systemie Linux pliki nagłówkowe są zazwyczaj instalowane w katalogu /usr/include, który powinien już stanowić część ścieżki wyszukiwania pliku dołączanego. Jeśli jednak pliki są zainstalowane gdzie indziej, będziesz musiał powiedzieć kompilatorowi, gdzie je znaleźć.
  4. Powiedz linkerowi, gdzie ma szukać plików biblioteki. Podobnie jak w kroku 3, zazwyczaj wiąże się to z dodaniem katalogu do listy miejsc, w których linker szuka bibliotek. W systemie Windows jest to zazwyczaj podkatalog /lib katalogu, w którym zainstalowano pliki bibliotek. W systemie Linux biblioteki są zazwyczaj instalowane w katalogu /usr/lib, który powinien już stanowić część ścieżki wyszukiwania bibliotek.

Gdy biblioteka jest zainstalowana i IDE wie, gdzie jej szukać, dla każdego projektu, który chce użyć biblioteki, należy zazwyczaj wykonać następujące 3 kroki:

  1. Jeśli używasz bibliotek statycznych lub importujesz biblioteki, powiedz linkerowi, które pliki bibliotek ma połączyć.
  2. #include nagłówek biblioteki plików w swoim programie. Informuje to kompilator o wszystkich funkcjach oferowanych przez bibliotekę, dzięki czemu program będzie się poprawnie kompilował.
  3. Jeśli używasz bibliotek dynamicznych, upewnij się, że program wie, gdzie je znaleźć. W systemie Linux biblioteki są zwykle instalowane w katalogu /usr/lib, który znajduje się w domyślnej ścieżce wyszukiwania po ścieżkach w LD_LIBRARY_PATH zmienna środowiskowa. W systemie Windows domyślna ścieżka wyszukiwania obejmuje katalog, z którego uruchamiany jest program, katalogi ustawione przez wywołanie SetDllDirectory(), katalogi Windows, System i System32 oraz katalogi w zmiennej środowiskowej PATH. Najłatwiejszym sposobem użycia pliku .dll jest skopiowanie pliku .dll do lokalizacji pliku wykonywalnego. Ponieważ zazwyczaj rozpowszechniasz plik .dll wraz z plikiem wykonywalnym, warto i tak trzymać je razem.

Kroki 3-5 obejmują konfigurację IDE — na szczęście prawie wszystkie IDE działają w ten sam sposób, jeśli chodzi o wykonywanie tych czynności. Niestety, ponieważ każde IDE ma inny interfejs, najtrudniejszą częścią tego procesu jest po prostu zlokalizowanie gdzie właściwe miejsce do wykonania każdego z tych kroków. W związku z tym w ciągu kilku następnych lekcji w tej sekcji omówimy, jak wykonać wszystkie te kroki zarówno w programie Visual Studio, jak i Code::Blocks. Jeśli używasz innego IDE, przeczytaj oba — zanim skończysz, powinieneś mieć wystarczająco dużo informacji, aby zrobić to samo z własnym IDE po krótkim poszukiwaniu.

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
120 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze