Keresés

Részletes keresés

NevemTeve Creative Commons License 2005.06.16 0 0 4
Mindazonáltal, ha nem ragaszkodunk 'rpath'-hoz meg 'soname'-hez (mert pl csak dlopen-nel akarjuk használni a shared objectet), akkor elég ennyi:

gcc -fPIC -o foo.o -c foo.c
gcc -shared -o foo.so foo.o
NevemTeve Creative Commons License 2005.03.02 0 0 3
Namostan ugyanezt kipróbálván AIX-en örömmel láthatjuk, hogy a "kézi" verzió nem egészen működik, mivel a "ld" nem ismeri a -soname és -rpath opciókat, továbbá a shared objecteket is .a könyvtárban várja... ja, és még a "cp" sem ismeri a -d opciót...

Mindezt a "libtool" megoldja, az egyetlen vád, ami érheti hogy statikus library nem települ, a ~/lib/librut.a-ban csak a librut.so.0 van, a rutin.o, rut2.o nincs.
Előzmény: NevemTeve (2)
NevemTeve Creative Commons License 2005.03.02 0 0 2
Könyvtár installálás:

Hagyományos: cp -d librut* ~/lib
Megkönnyített: libtool --mode=install cp librut.la ~/lib/librut.la

Az a különbség, hogy a libtool-os verzió bele-hardkódolja a könyvtár path-ját
az exe3-ba, a hagyományos viszont nem (ez akkor számít. ha nem standard könyvtárba installálunk). Pótoljuk a hiányosságot:

gcc -o exe4 main.c -L. -Wl,-rpath,$(HOME)/lib -lrut
vagy, ha már installáltuk a könyvtárat:
gcc -o exe4 main.c -L${HOME}/lib -Wl,-rpath,${HOME}/lib -lrut
Előzmény: NevemTeve (1)
NevemTeve Creative Commons License 2005.03.02 0 0 1
Az előzőt egy kicsit helyesbítem: shared object készítése hagyományosan:
gcc -shared -Wl,-soname,librut.so.1 -o librut.so.1.0 rutin.o rut2.o
ln -sf librut.so.1.0 librut.so.1
ln -sf librut.so.1 librut.so

Ezután program szerkesztése hagyományosan:
gcc -o exe1 main.c rutin.o rut2.o
gcc -o exe2 main.c librut.a
gcc -o exe3 main.c -L. -lrut

A dinamikusan linkelt 'exe3' futtatása:
LD_LIBRARY_PATH=. ./exe3

libtool --mode=link gcc -o exe1 main.c rutin.lo rut2.lo
libtool --mode=link gcc -o exe3 main.c librut.la

Az utóbbi a futtatható programot ./libs/exe3 néven hozza létre,
a ./exe3 egy misztikus script, ami ugyanazt futtatja, de előbb
bűvészkedik valamit, hogy hozzáférjen a shared lib-hez.
Előzmény: NevemTeve (0)
NevemTeve Creative Commons License 2005.03.02 0 0 0
Könyvtár létrehozása:

Hagyományosan: ar rcs librut.a rutin.o rut2.o
Megkönnyítve: libtool --mode=link gcc -g -o librut.la rutin.lo rut2.lo

Eredménye:
.libs/librut.a - programkönyvtár (.libs-ben objektekből)
.libs/librut.la = ./librut.la - leírása a könyvtárról

Shared object/könyvtár léterhozása:
Hagyományosan: gcc -shared -Wl,-soname,librut.so.1 -o librut.so rutin.o rut2.o
Megkönnyítve: libtool --mode=link gcc -o librut.la rutin.lo rut2.lo -rpath ~/lib

Az utóbbiban a -rpath az esszenciális.
Az első eredménye: ./librut.so
A másodiké:
.libs/librut.so.0.0.0 = libs/librut.so.0 = libs/librut.so - maga a shared object
.libs/librut.lai - információs file
Előzmény: NevemTeve (-)
NevemTeve Creative Commons License 2005.03.02 0 0 topiknyitó
Ha jól értem a dolgot, a "libtool" célja az, hogy megkönnyítse a shared-libek létrehozását... végezzünk néhány próbát (GNU/linux)

Hagyományosan: gcc -fPIC -Wall -o rutin.o -c rutin.c
Megkönnyítve: libtool --mode=compile gcc -c rutin.c

Ennek hatására két object-modul képződik: rutin.o és .libs/rutin.o
az előbbi hagyományosan, az utóbbi "-fPIC -DPIC" opcióval
Továbbá keletkezik egy rutin.lo nevű szövegfile is,
a tartalma nagyjából ennyi:
pic_object='.libs/rutin.o'
non_pic_object='rutin.o'

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!