Linux alapok: statikus könyvtárak vs. dinamikus könyvtárak

Erika Caoili

követés

Dec 17, 2019 * 4 perc olvasás

fotó: Edwin Andrade az Unsplash oldalon

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 könyvtárak “*.tehát “elnevezési konvencióval rendelkeznek, a statikus könyvtárak pedig”*.a”.

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

  1. 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.
  2. 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.
  3. 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.
  4. kisebb fájlokat tárolnak.
  5. 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

  1. a statikus könyvtárak ellenállnak a sebezhetőségnek, mert a futtatható fájlban élnek.
  2. 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.
  3. a fájlok és a program módosításai újralinkelést és újrafordítást igényelnek.
  4. 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 flaghaszná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ése archive, és a statikus könyvtár létrehozására szolgál. Az összes ".o" – re végződő fájl hozzáadódik a liball.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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.