Statikus könyvtár

Innen: Hungaropédia
Ugrás a navigációhozUgrás a kereséshez

A statikus könyvtár (static library) vagy statikusan összekapcsolt könyvtár (statically linked library) olyan függvényeket és adatokat tartalmaz, amelyeket a programkészítéskor be lehet építeni az azokat használó számítógépes programba, így a könyvtárnak nem kell külön fájlban elérhetőnek lennie futáskor.[1] Ha minden könyvtár statikusan van összekapcsolva, akkor az eredmény egy önálló, azaz statikus build lesz. Egy statikus könyvtárat vagy összeolvasztanak más statikus könyvtárakkal és objektumfájlokkal a build(wd) idején, hogy egyetlen futtatható állományt alkossanak, vagy futáskor betöltik a megfelelő futtatható állomány címtartományába a fordítási/linkelési időben meghatározott statikus memóriaeltolással.

Összehasonlítás a dinamikus összekapcsolással

Történelmileg minden könyvtár összekapcsolása (linking) statikus volt, de ma már a dinamikus összekapcsolás(wd) is egy alternatíva, amely azonban magában hordozza a velejáró kompromisszumokat. A statikus előnye a dinamikushoz képest, hogy az alkalmazás garantáltan rendelkezik a szükséges könyvtári rutinokkal a futás idején, mivel a rutinok kódja be van ágyazva a futtatható fájlba. A dinamikus linkelésnél nem csak a könyvtárfájl hiányozhat, de még ha meg is találjuk, az egy inkompatibilis verzió is lehet. A statikus linkeléssel elkerülhető a DLL-pokol, vagy általánosabban a függőségi pokol, ezért egyszerűsítheti a fejlesztést, a terjesztést és a telepítést. Egy másik kompromisszum a könyvtár betöltéséhez használt memória. Statikus linkelés esetén az intelligens linker csak a ténylegesen használt kódot tartalmazza, de egy dinamikus könyvtár esetében a teljes könyvtár betöltődik a memóriába. Egy másik kompromisszum, hogy a statikus linkeléssel nagyobb a futtatható fájl mérete, mint a dinamikus linkeléssel. Ha azonban az alkalmazás méretét a végrehajtható állomány és a dinamikus könyvtárak összegeként mérjük, akkor a statikus linkelés esetén az összméret általában kisebb. Ha viszont ugyanazt a dinamikus könyvtárat több alkalmazás is használja, akkor a kombinált alkalmazások és a DLL-ek összmérete a dinamikus linkeléssel kisebb lehet. A Windows rendszereken bevett gyakorlat, hogy a program dinamikus könyvtárakat a programfájllal együtt telepítik.[2] Unix-szerű rendszereken ez kevésbé elterjedt, mivel a csomagkezelő rendszerek segítségével biztosítható, hogy a megfelelő könyvtárfájlok egy megosztott, rendszerszintű helyen rendelkezésre álljanak. Ez lehetővé teszi a könyvtárfájlok megosztását az alkalmazások között, ami helytakarékosságot eredményez. Emellett lehetővé teszi a könyvtár frissítését a hibák és biztonsági hibák javítása érdekében anélkül, hogy a könyvtárat használó alkalmazásokat frissíteni kellene. A megosztott, dinamikus könyvtárak azonban a függőségi problémák kockázatához vezetnek. A gyakorlatban sok futtatható program statikus és dinamikus könyvtárakat egyaránt használ.

Linkelés és betöltés

Bármely statikus könyvtári függvény meghívhat egy másik statikus könyvtárban lévő függvényt vagy eljárást. A linker és a loader ugyanúgy kezeli ezt, mint más objektumfájlok(wd) fajtáit. A statikus könyvtárfájlokat futáskor egy linker-loaderrel (pl. az X11 modul betöltővel) lehet összekapcsolni. Az azonban, hogy egy ilyen folyamatot statikus linkelésnek lehet-e nevezni, vitatott.

Statikus könyvtárak létrehozása C/C++ nyelven

Statikus könyvtárak könnyen létrehozhatók C vagy C++ nyelven. Ez a két nyelv egyéb funkciók mellett tárolóosztály-specifikátorokat is biztosít a külső vagy belső összekapcsolás jelölésére. Egy ilyen könyvtár létrehozásához az exportált függvényeket/procedúrákat és egyéb objektumváltozókat külső linkelésre kell megadni (azaz nem a C static(wd) kulcsszó használatával). A statikus könyvtárak fájlnevei általában „.a” kiterjesztésűek Unix-szerű rendszereken[1] és „.lib” kiterjesztésűek Microsoft Windows rendszereken. Például egy Unix-szerű rendszeren a libclass.a nevű archívum létrehozásához a class1.o, class2.o, class3.o fájlokból a következő parancsot kell használni:[1]

ar rcs libclass.a class1.o class2.o class3.o

egy olyan program lefordításához, amely függ a class1.o, class2.o, és class3.o állományoktól, a következőket tehetjük:

cc main.c libclass.a

vagy (ha a libclass.a a szabványos könyvtár elérési útvonalában van, például /usr/local/lib)

cc main.c -lclass

vagy (a linkelés során)

ld ... main.o -lclass ...

ahelyett, hogy:

cc main.c class1.o class2.o class3.o

Jegyzetek

  1. 1,0 1,1 1,2 Static Libraries. TLDP. (Hozzáférés: 2013. október 3.)
  2. Anderson, Rick: The End of DLL Hell. microsoft.com, 2000. január 11. [2001. június 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2013. augusztus 31.) „Private DLLs are DLLs that are installed with a specific application and used only by that application.

Kapcsolódó szócikkek

Fordítás

  • Ez a szócikk részben vagy egészben a Static library című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.