mi a könyvtár Linux alatt?
miért használunk könyvtárakat?
Hogyan hozzunk létre statikus és dinamikus könyvtárat?
hogyan és miért használjuk őket?
Könyvtár Linux alatt
a könyvtár a függvényeknek nevezett kód előre összeállított darabjainak gyűjteménye. A könyvtár közös funkciókat tartalmaz, és együtt egy könyvtár nevű csomagot alkotnak. A funkciók olyan kódblokkok, amelyeket a program során újra felhasználnak. A kóddarabok ismételt használata egy programban időt takarít meg. Ez megakadályozza, hogy a programozó többször átírja a kódot. A programozók számára a könyvtárak újrafelhasználható funkciókat, adatstruktúrákat, osztályokat stb.
“például, ha olyan alkalmazást épít, amelynek matematikai műveleteket kell végrehajtania, akkor ehhez nem kell új matematikai függvényt létrehoznia, egyszerűen használhatja a könyvtárakban meglévő funkciókat az adott programozási nyelvhez.”(“A megosztott könyvtárak megértése Linux alatt”)
a könyvtár nem futtatható, és ez kulcsfontosságú különbség a folyamatoktól és az alkalmazásoktól. A könyvtárak futási vagy fordítási időben játszanak szerepet. A C programozási nyelvben kétféle könyvtár van: dinamikus könyvtárak és statikus könyvtárak.
a könyvtárak a "-c" gcc flag
által létrehozott objektumfájlokkal rendelkeznek, és a megállapodás szerint ".o"
– re végződnek. Ezek a fordító kimenetének eredményei, és bináris formában tartalmazzák a függvénydefiníciókat.
a dinamikus és statikus könyvtárak közötti különbségek
a dinamikus vagy megosztott könyvtárak különálló fájlokként fordulnak elő a futtatható fájlokon kívül. Így futásidőben csak egy példányra van szüksége a könyvtár fájljairól. Fordításkor a statikus könyvtárak zárva maradnak egy programban. Tartalmazza a fájl programjait, amelyek a könyvtár fájljainak másolatát tartalmazzák fordításkor.
dinamikus könyvtár használatakor a programozó hivatkozik arra a könyvtárra, amikor futásidőben szükséges. Például a string length függvény eléréséhez a standard input/output header file
— dinamikusan elérheti. A dinamikus betöltő miatt futás közben megtalálja a program könyvtári hivatkozását. Ezután betölti a karakterlánc hossza funkciót a memóriába. Így a dinamikus könyvtár hozzáférhetőségének könnyen elérhetőnek kell lennie, különben erőtlenné válik.
a dinamikus könyvtárak előnyei és hátrányai
- csak egy példányra van szüksége futásidőben. Ez attól függ, hogy az alkalmazás és a könyvtár szorosan elérhető-e egymás számára.
- több futó alkalmazás ugyanazt a könyvtárat használja anélkül, hogy minden fájlnak saját példánya lenne.
- mi történik azonban, ha a dinamikus könyvtár megsérül? Előfordulhat, hogy a futtatható fájl nem működik, mert a futtatható fájlon kívül él, és sérülékeny.
- kisebb fájlokat tárolnak.
- a dinamikus könyvtárak futási időben kapcsolódnak egymáshoz. Nem igényel újrafordítást és újralinkelést, amikor a programozó változtat.
fordításkor az alkalmazások statikus könyvtárakat használnak. A függvények összes példánya bekerül az alkalmazásfájlba, mert a folyamat futtatásához szükségesek.
a statikus könyvtárak előnyei és hátrányai
- a statikus könyvtárak ellenállnak a sebezhetőségnek, mert a futtatható fájlban élnek.
- a sebesség futási időben gyorsabb, mert a tárgykód (bináris) a futtatható fájlban van. Így a függvényekre irányuló hívások gyorsabban végrehajtódnak. Ne feledje, hogy a dinamikus könyvtár a futtatható fájlon kívül él, ezért a hívásokat a futtatható fájl kívülről kell kezdeményezni.
- a fájlok és a program módosításai újralinkelést és újrafordítást igényelnek.
- a fájl mérete sokkal nagyobb.
Hogyan készítsünk statikus és dinamikus könyvtárat?
mindkét könyvtár esetében a programnak tartalmaznia kell egy prototype
értéket a könyvtárban található összes funkcióhoz. Ha fejlécfájlt használ, ne felejtse el megadni a header filename
értéket.
#include "<header file name>"
dinamikus könyvtárak
dinamikus könyvtár létrehozásához írja be a következő parancsot:
gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so
a "*.c"
– segítségével az aktuális könyvtár összes C forrásfájlját felveszi, és létrehoz egy "liball.so."
nevű megosztott könyvtárat a -fPIC
jelző lehetővé teszi a következő kód hivatkozását bármely virtuális címen futásidőben. A pozíciófüggetlen kódot jelenti.A könyvtár nem tárolja az adatokat rögzített címeken, mert a memóriában lévő helye megváltozik a programok között. Az objektumfájlok összeállítása a -shared flag
használatával történik. A compiler
később azonosítja a könyvtárat a "lib"
kezdőbetűvel kezdődő és az elnevezési konvencióval végződő fájlok keresésével, .so
a programnak szüksége van az elérési útra a könyvtárfájlok kereséséhez. Tehát be kell írnia a következő parancsot, hogy hozzáadja ezt a helyet a hívott környezeti változóhoz LD_LIBRARY_PATH.
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
a dinamikus könyvtár használatakor írja be a következő parancsot:
gcc -g -wall -o app app.c liball.so
statikus könyvtárak
statikus könyvtár létrehozásához a következő parancsot kell használnunk:
ar rc liball.a dog.o cat.o bird.o
a
"ar"
jelentésearchive
, és a statikus könyvtár létrehozására szolgál. Az összes".o"
– re végződő fájl hozzáadódik aliball.a library
– hez, és ebben az esetben ezek az objektumfájlok.a
-rc flag
két dolgot tesz: kicseréli és létrehoz egy új könyvtárat, ha még nem létezik. A következő lépés az indexelés, ehhez gépelünk:
ranlib liball.a
a statikus könyvtár használatakor írja be a következő parancsot:
gcc main.c -L -l<filename>
a -L flag
hozzáfér a linker
– hez, így a könyvtárak megtalálhatók az adott könyvtárban. Ezenkívül más helyeket is keres, ahol a fordító rendszerkönyvtárakat keres.