Linux Základy: Statické Knihovny vs. Dynamické Knihovny

Erika Caoili

Následovat

Dec 17, 2019 · 4 min číst

Fotografie od Edwin Andrade na Unsplash

Co je knihovna, v Linuxu?

proč používáme knihovny?

jak vytvořit statickou a dynamickou knihovnu?

jak a proč je používáme?

knihovna v Linuxu

knihovna je sbírka předkompilovaných částí kódu nazývaných funkce. Knihovna obsahuje společné funkce a společně tvoří balíček nazvaný-knihovna. Funkce jsou bloky kódu, které se znovu používají v celém programu. Použití kousky kódu znovu v programu šetří čas. Zabraňuje programátorovi několikrát přepisovat kód. Pro programátory poskytují knihovny opakovaně použitelné funkce, datové struktury,třídy atd.

„například, pokud vytváříte aplikaci, která potřebuje provést matematické operace, nemusíte vytvořit nové matematické funkce, můžete jednoduše použít stávající funkce v knihovnách pro daný programovací jazyk.“(„Porozumění sdíleným knihovnám v Linuxu“)

Knihovna není spustitelná a to je klíčový rozdíl od procesů a aplikací. Knihovny hrají svou roli v době běhu nebo v době kompilace. V programovacím jazyce C máme dva typy knihoven: dynamické knihovny a statické knihovny.

knihovny mají objektové soubory vytvořené pomocí "-c" gcc flag a končí v ".o" konvencí. Jsou výsledkem výstupu kompilátoru a obsahují definice funkcí v binární podobě.

Rozdíly Mezi Dynamické a Statické Knihovny

Dynamické knihovny mají „*.takže“ pojmenování a statické knihovny „*.a“.

dynamické nebo sdílené knihovny se vyskytují jako samostatné soubory mimo spustitelné soubory. Potřebuje tedy pouze jednu kopii souborů knihovny za běhu. V době kompilace zůstávají statické knihovny uzamčeny v programu. Obsahuje programy souboru, které drží kopii souborů knihovny v době kompilace.

při použití dynamické knihovny programátor odkazuje na tuto knihovnu, když potřebuje za běhu. Například pro přístup k funkci délky řetězce z standard input/output header file – můžete k ní přistupovat dynamicky. Najde odkaz na knihovnu programu za běhu kvůli dynamickému zavaděči. Poté načte tuto funkci délky řetězce do paměti. Tím pádem, dynamická dostupnost knihovny musí být snadno dostupná nebo se stává bezmocnou.

výhody a nevýhody dynamických knihoven

  1. potřebuje pouze jednu kopii za běhu. Závisí to na tom, že aplikace a knihovna jsou navzájem úzce dostupné.
  2. více spuštěných aplikací používá stejnou knihovnu bez nutnosti mít každý soubor vlastní kopii.
  3. co když se však dynamická knihovna poškodí? Spustitelný soubor nemusí fungovat, protože žije mimo spustitelný soubor a je náchylný k rozbití.
  4. obsahují menší soubory.
  5. dynamické knihovny jsou propojeny za běhu. Nevyžaduje rekompilaci a opětovné propojení, když programátor provede změnu.

v době kompilace aplikace využívají statické knihovny. Všechny kopie funkcí se umístí do souboru aplikace, protože jsou potřebné ke spuštění procesu.

výhody a nevýhody statických knihoven

  1. statické knihovny odolávají zranitelnosti, protože žijí uvnitř spustitelného souboru.
  2. rychlost za běhu nastává rychleji, protože jeho objektový kód (binární) je ve spustitelném souboru. Tím pádem, volání na funkce se provádí rychleji. Pamatujte, že dynamická knihovna žije mimo spustitelný soubor, takže volání by byla prováděna z vnějšku spustitelného souboru.
  3. změny provedené v souborech a programu vyžadují opětovné propojení a rekompilaci.
  4. Velikost souboru je mnohem větší.

jak vytvoříte statickou a dynamickou knihovnu?

pro obě knihovny by měl váš program obsahovat prototype pro každou z funkcí, které existují ve vaší knihovně. Pokud používáte hlavičkový soubor, nezapomeňte zahrnout header filename.

#include "<header file name>"

Dynamické Knihovny

vytvořit dynamické knihovny, napište následující příkaz:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

S "*.c" — to znamená všechny C zdrojové soubory v aktuálním adresáři a vytvoří sdílenou knihovnu s názvem "liball.so." -fPIC vlajky umožňuje následující kód odkazuje na virtuální adresu v běhu. To je zkratka pro pozici nezávislý kód.Knihovna neuchovává data na pevných adresách, protože její umístění v paměti se mezi programy změní. Soubory objektů se zkompilují pomocí -shared flag. compiler bude později identifikovat knihovně vyhledáním souborů, které začínají "lib" a konče pojmenování, .so

program potřebuje na cestu s cílem hledat soubory knihovny. Takže, musíte zadat následující příkaz dodat, že umístění do proměnné prostředí tzv. LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Při použití dynamické knihovny, zadejte následující příkaz:

gcc -g -wall -o app app.c liball.so

Statické Knihovny

vytvořit statické knihovny, musíme použít následující příkaz:

ar rc liball.a dog.o cat.o bird.o

"ar" je zkratka pro archive a to se používá k vytvoření statické knihovny. Všechny soubory končící na ".o" budou přidány do liball.a library a v tomto případě jsou to objektové soubory.

-rc flag provede dvě věci: nahradit a vytvořit novou knihovnu, pokud již neexistuje. Dalším krokem je indexování, k tomu zadáme:

ranlib liball.a

při použití statické knihovny zadejte následující příkaz:

gcc main.c -L -l<filename>

-L flag přistupuje k linker, takže knihovny lze nalézt v daném adresáři. Také vyhledává další místa, kde kompilátor hledá systémové knihovny.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.