Statikus könyvtár

statikusan linkelt programkönyvtár From Wikipedia, the free encyclopedia

Remove ads

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.

Remove ads

Ö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.

Remove ads

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

Kapcsolódó szócikkek

Fordítás

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads