Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Raspoložive C biblioteke

[es] :: C/C++ programiranje :: Raspoložive C biblioteke

[ Pregleda: 2224 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dial.InfoSky.Net.



+2789 Profil

icon Raspoložive C biblioteke23.11.2005. u 08:26 - pre 224 meseci
Kada se prevode C programi za Linux pomocu gcc, onda je neophodno koristiti direktivu -lm ukoliko se koriste funkcije iz zahlavlja math.h. Postoji li način da se sazna koja zaglavlja biblioteka zahtevaju direktive -lxxx za linkovanje, i kako glasi direktiva za koju biblioteku? Pitanje se odnosi na Linux/gcc i instalirane biblioteke na sistemu.

Recimo, sveže je instaliran sistem, dolazi neki Linux/C/gcc majstor, i treba da sastavi spisak svih -lxxx direktiva koje će gcc da prepozna bez instaliranja nekih novih biblioteka, kao i kojoj biblioteci odgovara koja direktiva.

Da dodatno pojasnim pitanje. Kako gcc "zna" koje su mu direktive -lxxx na raspolaganju, i koja oyna;ava linkovanje sa kojom bibliotekom?

[Ovu poruku je menjao Nedeljko dana 23.11.2005. u 11:29 GMT+1]
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Raspoložive C biblioteke23.11.2005. u 12:44 - pre 224 meseci
Citat:
Nedeljko:
Postoji li način da se sazna koja zaglavlja biblioteka zahtevaju direktive -lxxx za linkovanje, i kako glasi direktiva za koju biblioteku?
[...]
Kako gcc "zna" koje su mu direktive -lxxx na raspolaganju, i koja oyna;ava linkovanje sa kojom bibliotekom?


Premda možda pitanje deluje jednostavno, odgovor je zapetljan :) Što je najgore, ima više mogućnosti, i nije baš najjasnije u svakoj situaciji koja je najbolja (barem meni nije).

Najpre, nema nikakvog jednoznačnog načina da se povežu zaglavlje i biblioteka, tj. da se zna za koje zaglavlje je potrebna koja biblioteka. C i C++ prosto nemaju nikakve zahteve po tom pitanju. Ponekad čak, radi brže gradnje većih projekata, programeri uopšte ne uključe neko zaglavlje, već samo prekopiraju ono par deklaracija što im treba iz njega u svoj izvor. Od heurističkih pristupa, ja npr. obično potražim datu datoteku zaglavlja u Debijanovoj ogromnoj bazi, gde ako se nalazi, vidi se kom paketu, tj. kojoj biblioteci pripada.

Zatim, kada je u izvor jednom uključeno zaglavlje foo.h, kojem odgovara biblioteka libfoo, postoje ne jedna, već dve stvari koje treba izabrati: kako program sagraditi, i (najčešće, ako se ne gradi statički) kako ga kasnije pokretati.

Gradnja: kompilator (gcc) nema veze sa povezivanjem biblioteka, te će direktiva -lfoo, za povezivanje biblioteke libfoo, biti prosleđena povezivaču (ld), koji kompilator automatski poziva u pozadini. Ovo je bitno napomenuti, jer sve što je vezano za biblioteke ne treba tražiti u uputnoj strani za gcc, već za ld.

Dakle, kad naiđe na opciju -lfoo, povezivač će pokušati da pronađe deljenu biblioteku, datoteku po imenu libfoo.so, ili statičku biblioteku libfoo.a u slučaju da deljena nije dostupna. A u kojim putanjama će tražiti tu datoteku, tačno je, redom prvenstva, navedeno u uputnoj strani. Grubo, prvenstvo bi bilo ovakvo:

1. Putanje date u komandnoj liniji, opcijama -L i -rpath, po redu pojavljivanja
2. Putanje date u promenljivoj okruženja $LD_LIBRARY_PATH
3. Neke podrazumevane putanje, npr. /lib i /usr/lib
4. Putanje date u datoteci /etc/ld.so.conf

Znači, ako se ne koristi ništa osim biblioteka datih paketima distribucije, ništa dodatno ne mora da se navodi u komandnoj liniji pri kompilovanju, položaji biblioteka će biti razrešeni prema tačkama 3. i 4. Opcije 1. i 2. su tu ako se koristi biblioteka instalirana na nekom drugom mestu (ručno kompilovana, eksperimentalna, sopstvena kao deo projekta, itd.)

Pokretanje: ako su sve biblioteke zadovoljene prema stavkama 3. i 4. (ili je povezana statička biblioteka), pokretanje je kako bi se i očekivalo, samo pozivanje izvršne datoteke je dovoljno. Izvršni povezivač takođe podrazumevano traži u tim putanjama, tako da će moći da dozove deljene biblioteke pri pokretanju programa.

Ako su neke biblioteke zadovoljene prema 1. i 2., onda treba paziti. Ako je biblioteka pri gradnji došla iz opcije -L ili promenljive $LD_LIBRARY_PATH, onda putanje koje su njima bile date pri kompilovanju moraju biti prisutne u $LD_LIBRARY_PATH i po izvršavanju programa, inače izvršni povezivač neće moći da nađe biblioteku.

Ako je biblioteka došla iz opcije -rpath, povezivač će tu putanju (izvršna putanja, r-putanja) upisati u samu izvršnu datoteku programa, tako da će izvršni povezivač moći da je pronađe i ako se ne nalazi u $LD_LIBRARY_PATH pri pokretanju programa.

Uglavnom, pri pokretanju programa izvršni povezivač traži neophodne biblioteke ovim redom:

1. Prema putanjama u $LD_LIBRARY_PATH
2. Prema r-putanjama, tj. onim zapisanim u samu izvršnu datoteku (rpaths)
3. U podrazumevanim putanjama (/lib, /usr/lib) i onima u /etc/ld.so.conf

(Napomena: Ovo znači da će, kada se eksperimentiše sa više verzija iste biblioteke, putanja iz $LD_LIBRARY_PATH imati prednost nad r-putanjom.)

Ako se već datoteke ne instaliraju u podrazumevane putanje, rekao bih da se sa $LD_LIBRARY_PATH treba igrati jedino pri eksperimentisanju (tj. ne treba je imati globalno postavljenu), a koristiti r-putanje za programe koji treba da služe normalno na sistemu.

Da bi se olakšalo svo ovo davljenje sa bibliotekama, postoji program Libtul (Libtool), koji održava sopstvenu evidenciju o putanjama biblioteka (npr., pored samih .so datoteka, nalaze se obično datoteke istog imena, ali sa nastavkom .la). Zato ga treba koristiti kada se prave paketi biblioteka za instaliranje iz izvornog koda. GNUova kolekcija alata za gradnju, tj. ono što proizvodi lanac ./configure && make && make install, podrazumevano koristi Libtul.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Raspoložive C biblioteke

[ Pregleda: 2224 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.