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. 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 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 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. 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 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 kulcsszó használatával). A statikus könyvtárak fájlnevei általában „.a” kiterjesztésűek Unix-szerű rendszereken é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: ar rcs libclass.a class1.o class2.o class3.o egy olyan program lefordításához, amely függ a , , és állományoktól, a következőket tehetjük: cc main.c libclass.a vagy (ha a a szabványos könyvtár elérési útvonalában van, például ) 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

Kapcsolódó szócikkek Programkönyvtár Osztott könyvtár Linker Loader

Fordítás

Kategória:Programozási alapfogalmak Kategória:Szoftverfordítás