Programozás linux a semmiből - 3. fejezet
3. fejezet KÖNYVTÁR
3.1. Bevezetés a könyvtár
Amint azt már említettük az előző fejezetben, a könyvtár - egy sor rendezett egy különleges módon az objektum fájlok. A könyvtárak is csatlakozik a fő program idején összekötő. Összekapcsolásával módszer könyvtár osztva fájlok (statikus könyvtárak, statikus könyvtárak) és a közös (megosztott könyvtárakat, megosztott könyvtárak). Linux, ezen kívül vannak mechanizmusok dinamikusan lekérése könyvtárakban. A lényege a dinamikus podgruzki, hogy a futó program saját belátása csatlakozni arra gondolni, minden könyvtár. Ezzel a képességgel, hozzon létre programokat a plug-inek. mint például az XMMS. Ebben a fejezetben, akkor nem terjed dinamikusan betöltés és megáll a klasszikus használatát statikus és dinamikus könyvtárakat.
Szemszögéből az ICC modell könyvtár - ezen a szerveren. A könyvtárak közül egy fontos pont: a képesség, hogy ugyanazt a mechanizmusok a különböző programokat. A Linux, a könyvtár mindenütt használható, mert ez egy nagyon kényelmes módja annak, hogy „nem feltalálni a kereket.” Még Linux kernel bizonyos értelemben nevű könyvtárat a rendszer hívás mechanizmus.
Statikus könyvtár - ez csak egy archív tárgy kép, ami össze van kötve a program idején összekötő. A hatás ugyanaz, mint ha az egyes fájlok külön-külön.
A Linux, statikus könyvtárak általában kiterjesztése .a (Archív), és a megosztott könyvtárakat kiterjesztése .so (Shared Object). A könyvtárak, általában könyvtárak / lib és / usr / lib. Abban az esetben, egy másik elrendezés (csak a megosztott könyvtárak) kis „podshamanit”, hogy a program futtatásához.
3.2. Példa statikus könyvtár
Most létre saját könyvtárat két funkciója van: h_world () és g_world (), amely megjeleníti a „Hello World” és a „Goodbye World” volt. Kezdjük a statikus könyvtár.
Kezdjük a felület. World.h hozzon létre egy fájlt: Ön most jelentette be a funkciókat, amelyeket használni fognak.
Most végre kell hajtani a szerver. H_world.c hozzon létre egy fájlt: Most hozzon létre g_world.c tartalmazó fájl végrehajtása g_world () függvényt: Ez lehet ugyanolyan jól illeszkedik mindkét funkciót egyetlen fájlban (hello.c, például), de az egyszerűség kedvéért mi végeztünk a kódot két fájl .
Most hozzon létre egy fájlt main.c. Ez az ügyfél, aki használja a szolgáltatást a kiszolgálón:
Most írni egy forgatókönyvet, hogy. Ehhez hozzon létre egy Makefile: Ne felejtse el, hogy a fül előtt minden szabály a cél kötvények.
Továbbra is csak annak ellenőrzésére, hogy a program működik, és megérteni, hogy mit tettünk a következő:
Így, ebben a példában, három új dolgokat: -l és -L fordító, valamint az ar parancsot. Kezdjük az utóbbival. Ahogy talán már sejtette, ar parancs létrehoz egy statikus könyvtár (archív). Ebben az esetben a két tárgy fájlokat együtt egy file libworld.a. Linux alatt gyakorlatilag az összes könyvtár előtagja lib.
Mint már említettük, a gcc maga okozza a kapcsoló, ha szükség van rá. -l opciót, át a fordító, linker feldolgozzák és az egyik csatlakozik a bináris könyvtárba. Mint látható, a könyvtár nevét „levágták” előtag és az utótag. Ezt annak érdekében, hogy hozzon létre egy „látszólagos közömbössége” statikus és dinamikus könyvtárakat. De ez lesz szó más fejezetekben. Most az a fontos, hogy tudja, hogy egy könyvtár és egy könyvtár libfoo.so libfoo.a a projekthez kapcsolódó opció -lfoo. Esetünkben libworld.a „vágott le”, hogy -lworld.
A -L opció meghatározza az összekötő hol kell keresni a könyvtár. Ha a könyvtár található a / lib vagy / usr / lib, akkor a kérdés már nem releváns, és a -L opció nincs szükség. Ebben az esetben a könyvtár az adattár (az aktuális könyvtár). Alapértelmezésben a linker nem vizsgálja felül az aktuális könyvtár a könyvtár kereső, így -L opció. (Dot jelenti az aktuális könyvtár) van szükség.
3.3. Példa megosztott könyvtár
Létrehozása és használata a dinamikus (megosztott) könyvtár, ahhoz, hogy változtassa meg a projekt Makefile.
Külsőleg semmi sem változott: a program fordítása, fut, és végezze el a fenti lépéseket, mint az előző esetben. Megváltoztattam a belső lényegét. amely elsődleges szerepet játszik a programozót. Tekintsük mindent annak érdekében.
A szabály az összeállítás bináris most is ijesztő lehetőség -Wl, -rpath,. Semmi baj nincs itt. Amint azt már többször hangsúlyoztuk, a gcc fordító maga okozza a linker ld, amikor arra szükség van, és átadja a kívánt építmények lehetőségeket, amelyek megment minket a felesleges bürokráciát platform-függő. De néha még meg kell beavatkozni ebbe a folyamatba, és továbbítja linker „saját” opciót. Ehhez használja a lehetőséget -Wl fordító, opció, optargs. Azt átírni: pass kapcsolót (-Wl) opció opció érvekkel optargs. A mi esetünkben, átadjuk a linker opció -rpath érv. (Point, az aktuális könyvtár). Felmerül a kérdés: mi az a lehetőség -rpath? Mint már említettük, az összekötő keres könyvtárak bizonyos helyeken; általában könyvtárak / lib és / usr / lib, néha a / usr / local / lib. -rpath opció csak tovább növeli ezt a listát egy másik katalógusban. A mi esetünkben ez az aktuális könyvtárban. Anélkül -rpath opció, a linker „csend” hozza össze a programot, de ha elkezd akkor meg kell várni a meglepetés: a program nem indul el, mert hiányzik a könyvtárból. Próbálja meg eltávolítani a lehetőséget -Wl, -rpath. A Makefile és újjáépíteni a projekt. Amikor megpróbálja futtatni a bináris program befejezése a visszatérési kód 127 (a visszatérési kódok lesz szó a későbbi fejezetekben). Ugyanez történik, ha a hívás egy programot egy másik könyvtárba. Visszatér -Wl, -rpath. újjáépíteni a projekt, menj fel egy magasabb szintre a cd parancsot. és próbálja meg futtatni a bináris világ / bináris parancsot. Ez nem fog működni, mert ez az új könyvtári katalógusban nem.
Van egy módja, hogy nem küldi további kapcsoló opciók segítségével -Wl - használata LD_LIBRARY_PATH környezeti változó. A későbbi fejezetekben fogunk foglalkozni környezetvédelmi témák mélységben (környezet). Most csak azt mondják, hogy minden felhasználó rendelkezik egy úgynevezett környezet (környezet) egy sor pár VAR = ÉRTÉK által használt programokat. Ha szeretné látni a környezetet, írja be a parancsot env elég. Ahhoz, hogy hozzá egy környezeti változót, egyszerűen írja export változó = érték és a változó eltávolítása a környezetet, meg kell tárcsázni export -n változó. Legyen óvatos: export - ez vnutrennayaya csapat bash shell; más héjak (csh, ksh.) használja a különböző parancsokat dolgozik a környezetet. LD_LIBRARY_PATH környezeti változó tartalmaz egy listát a további „helyek” elválasztott dvoetochieyami ahol linkovschih kell keresni a könyvtár.
Annak ellenére, hogy a jelen két adatátviteli mechanizmusok nem szabványos helyen könyvtárak, akkor jobb, hogy helyezze a könyvtár a végleges projekt a / lib és / usr / lib. Engedélyezett a helyét a könyvtárak Éppen ezért az / usr / lib és / usr / local / lib (annak megjelölésével -Wl, -rpath). De arra kényszerítve a végfelhasználó beállítani LD_LIBRARY_PATH szinte mindig rossz programozási stílus.
A következő fontos részlet - az alkotás folyamatát a könyvtárban. A statikus könyvtárak hozhatók létre ar archiváló és közös - gcc opció -shared. Ebben az esetben is ez okozza a gcc linkért, de nem az összeszerelés a bináris, és hozzon létre egy dynamic link library.