*.a kiterjesztésű fájlok?

 ( andriscom | 2010. október 16., szombat - 11:10 )

Sziasztok,

Szeretnék csinálni egy csomagot a libxmlrpc-ből de fordítás után csomó "sallang" is készül a libraryvel (pl: *.h -> header fájlok) amiket egy külön dev csomagba raknék bele.

A kérdésem az lenne, hogy a lib könyvtárban lévő .a fájlok azok mik? Ha belenézek akkor bináris mindegyik. Kellenek ezek a library normális működéséhez vagy mehetnek a dev csomagba külön? A lib könyvtárban lévő .so fájlok igazából a library bináris cuccai, de nem tudom hogy elegendőek-e önmagukban.

köszi

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ennyit tudok róla:

$ ar tv file.a
$ dpkg -L binutils

~~~~~~~~
De ezt az egy lépést ki nem tevé,
Az nem tett semmit, nem tud semmit is.

ha a programod dinamikusan linkelt, akkor a *.so fileok elegendo"ek a lib csomagba. fejleszteshez a *.h-k elegendoek szinten, de ha a leendo" tovabbi fejlesztoknek meg akarod a adni a statikus linkekes lehetoseget is, akkor a *.a archiv fileokat is tedd bele a lib-dev csomagba. ezek meretre kb ugyanakkorak nagysagrendben mint a megf. *.so fileok, csak nincsenek dinamikus betoltesre elokeszitve, lenyegeben olyan archiv (`ar` nevu programmal keszult) fileok, amikben az egyes modulok (*.o) csak ossze vannak o"mlesztve. olyannyira hogy akar ki is tudod listaztatni (`ar t libxyz.a`), meg kibontani (pl. midnight commanderrel ugyanugy bele tudsz ma'szni mint egy *.tar-ba). a shared object-ek mar ennel jobban osszeszerkesztett valamik, amiket a kernel ill a libc loader es/vagy kernel mar kis erofeszitessel fel tud hasznalni (lenyegeben futtathato elf fileok, nagyon hasonlo strukturaval csak belepesi pont nelkul).

Köszönöm a részletes választ! :)

Ennél picit bonyolultabb a dolog.

A libedet kétféleképpen lehet felhasználni:

- shared libként (.so), ilyenkor a hozzáfordított program nem fogja tartalmazni a kódodat, az .so formájában a futtatáskor még fog mellé kelleni; viszont cserébe a program fordításakor használt .so helyett azzal csereszabatos újabb verziót is lehet használni

- static libként (.a), ilyenkor a hozzáfordított programba beleépül a lib, és onnantól kezdve nem fog kelleni már külön a futtatáskor a lib, viszont az így beleépült lib nem is cserélhető ki újrafordítás nélkül.

Mindkét esetben kellenek a .h fájlok a hozzáfordításhoz.

A static lib .a fájl formájában tartalmazza az egyes .o fájlokat; a .a nem tartalmaz extra információt, bármikor összerakható egy marék .o fájlból, ill. bármelyik ki is lehet belőle venni.
A shared lib .so fájl formájában tartalmazza összelinkelve a .o fájlok tartalmát, ebből az egyes .o-k már nem szedhetők ki, az egész egyetlen bináris kóddá egyesül.

A .o fájlok előállításánál speciális flageket kell használni, ha .so-ba akarod őket berakni (-fpic/-fPIC). A statikus linkelésnél erre nincs szükség, emiatt a statikus linkeléshez készített .a-ba általában más flagekkel fordított .o-kat raknak a Makefile-ban, mint a .so-ba. Tehát a forrásfájlok kétszer fordulnak le, egyszer a statikus, egyszer a shared linkeléshez.