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

Djeljene biblioteke (shared libraries) i oznacavanje verzija

[es] :: Linux :: Djeljene biblioteke (shared libraries) i oznacavanje verzija

[ Pregleda: 1948 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Sale_123
C++ Developer
Wien

Član broj: 23293
Poruke: 219
*.cust.tele2.at.



+120 Profil

icon Djeljene biblioteke (shared libraries) i oznacavanje verzija03.12.2010. u 02:33 - pre 163 meseci
Citam sad na netu nesto o djeljenim bibliotekama, pa mi odredjene stvari nisu jasno, ako neko zna, volio bih da mi malo detaljnije objasni, ili da bar da dobar link gdje je to fino objasnjeno.

Evo sta sam ja skontao.

Recimo da ja instaliram djeljenu biblioteku na moj racunar (biblioteka se npr. zove foo).
Ako je u pitanju npr. verzija 2.3.1.4, koraci su slececi:

1. Biblioteku kopiram u /usr/lib/libfoo.so.2.3.1.4
2. Izvrsim ldconfig
3. Napravim simbolicke linkove libfoo.so -> libfoo.so.2 -> libfoo.so.2.3 -> libfoo.so.2.3.1 -> libfoo.so.2.3.1.4

Kad kompajliram moj program, koristim
Code:

g++ -o myprog myprog.cpp -lfoo


E sad, sta se desava kad hocu da instaliram novu biblioteku, recimo 3.1.0.0?
Ja hocu da zadrzim staru i da mi programi kompajlirani sa starom bibliotekom, koriste tu staru, a novi programi novu biblioteku.
Pretpostavljam da sada imamo sledecu situaciju:

Code:

libfoo.so -> libfoo.so.3 -> libfoo.so.3.1 -> libfoo.so.3.1.0 -> libfoo.so.3.1.0.0
libfoo.so.2 -> libfoo.so.2.3 -> libfoo.so.2.3.1 -> libfoo.so.2.3.1.4


Pretpostavljam da ce linker prilikom pokretanja mog programa da koristi verziju 3.1.0.0 umjesto 2.3.1.4.

1. Kako to izbjeci?

Ja sam recimo pokusavao da ne pravim simbolicku vezu libfoo.so, nego da koristim libfoo.so.2, ali to ne funcionise, tj. ne mogu kompajlirati program. Pokusavao sam recimo
Code:

g++ -o myprog myprog.cpp -lfoo2

ali nije funcionisalo.

2. Kako kompajlirati program da koristi biblioteku samo odredjenog major release-a (libfoo.so.2)?
3. Sta se desava kada dodje nova verzija, tipa 2.4.0.0?

...
 
Odgovor na temu

combuster
Ivan Bulatovic
Kraljevo

Član broj: 151351
Poruke: 4563
*.dynamic.isp.telekom.rs.

Sajt: www.linuxsrbija.org


+104 Profil

icon Re: Djeljene biblioteke (shared libraries) i oznacavanje verzija03.12.2010. u 11:35 - pre 163 meseci
1. Staticki kompajliras program

Citat:

Alternatively, static linking can be forced with the -static option to gcc to avoid the use of shared libraries:

$ gcc -Wall -static -I/opt/gdbm-1.8.3/include/
-L/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm


http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

Ili razdvojis direktorijume za nove i stare biblioteke ako su ti bas potrebne i onda:

LD_LIBRARY_PATH=/putanja_do/dir_sa_matorim_libom
export LD_LIBRARY_PATH

pa pokrenes program da ne bi ucitavao novu biblioteku

2. Pretpostavljam da ovo gore ti odgovara i za drugo pitanje

3. Distribucije obicno ili ne zadrzavaju uopste matore biblioteke ili ostave samo so.ver a novu symlinkuju na .so

Onda svi programi koji su kompajlirani protiv starih biblioteka ce prestati da rade, distribucije onda rekompajliraju sve programe koje zavise od njih da bi koristili novu. Recimo libpng i libjpeg kada se bump-nu sa verzijom gomila software-a koji ih koriste se svi moraju rekompajlirati. It's a dirty work but somebody got to do it :)
make love - !war
 
Odgovor na temu

niceness
Novi Sad

Član broj: 93992
Poruke: 993



+22 Profil

icon Re: Djeljene biblioteke (shared libraries) i oznacavanje verzija03.12.2010. u 12:56 - pre 163 meseci
Citat:

E sad, sta se desava kad hocu da instaliram novu biblioteku, recimo 3.1.0.0?
Ja hocu da zadrzim staru i da mi programi kompajlirani sa starom bibliotekom, koriste tu staru, a novi programi novu biblioteku.
Pretpostavljam da sada imamo sledecu situaciju:

Code:

libfoo.so -> libfoo.so.3 -> libfoo.so.3.1 -> libfoo.so.3.1.0 -> libfoo.so.3.1.0.0
libfoo.so.2 -> libfoo.so.2.3 -> libfoo.so.2.3.1 -> libfoo.so.2.3.1.4


Pretpostavljam da ce linker prilikom pokretanja mog programa da koristi verziju 3.1.0.0 umjesto 2.3.1.4.

libfoo.so se koristi samo za vreme kompajliranja/linkovanja, tako da tvoj stari program ce i dalje da koristi libfoo.so.2... pogledaj sa ldd ./myprog .
Problemi ce nastati samo ako npr. uklonis libfoo.so.2 link.

Citat:

Ja sam recimo pokusavao da ne pravim simbolicku vezu libfoo.so, nego da koristim libfoo.so.2, ali to ne funcionise, tj. ne mogu kompajlirati program. Pokusavao sam recimo
Code:

g++ -o myprog myprog.cpp -lfoo2

ali nije funcionisalo.

2. Kako kompajlirati program da koristi biblioteku samo odredjenog major release-a (libfoo.so.2)?

Ako hoces da linkujes naspram neke specificne verzije:
Code:
g++ -o myprog /usr/lib/libfoo.so.2 myprog.cpp


Citat:
3. Sta se desava kada dodje nova verzija, tipa 2.4.0.0?

combuster je vec odgovorio, sve zavisi... ako su ABI kompatibilne, nista :)
 
Odgovor na temu

combuster
Ivan Bulatovic
Kraljevo

Član broj: 151351
Poruke: 4563
*.dynamic.isp.telekom.rs.

Sajt: www.linuxsrbija.org


+104 Profil

icon Re: Djeljene biblioteke (shared libraries) i oznacavanje verzija03.12.2010. u 13:16 - pre 163 meseci
Citat:

sve zavisi... ako su ABI kompatibilne, nista :)


+1 zaboravih to da dodam...
make love - !war
 
Odgovor na temu

Sale_123
C++ Developer
Wien

Član broj: 23293
Poruke: 219
*.cust.tele2.at.



+120 Profil

icon Re: Djeljene biblioteke (shared libraries) i oznacavanje verzija03.12.2010. u 16:32 - pre 163 meseci
Hvala vam na odgovorima. Uspio sam i ja u medjuvremenu iskopati jos nekakve informacije.

Citat:
niceness
libfoo.so se koristi samo za vreme kompajliranja/linkovanja, tako da tvoj stari program ce i dalje da koristi libfoo.so.2... pogledaj sa ldd ./myprog .
Problemi ce nastati samo ako npr. uklonis libfoo.so.2 link.


E ovo me je bunilo, posto sam ja to vec isprobao, ali meni je ldd davao libfoo.so umjesto da daje libfoo.so.2. Kljucna stvar koju sam propustio bilo je navodjenje SONAME-a prilikom kreiranja bibilioteke.

U principu koliko sam skotao, sve minor release biblioteke bi u principu "trebale" (sto naravno zavisi od programera do programera) biti backwards compatible, i trebale bi da imaju isti soname. Tako da bi samo administrator prilikom instalacije morao libfoo.so.2 da relinkuje na novu verziju npr. libfoo.so.2.4.1.1.

Ako su ABI razliciti, onda bi trebalo uvesti novi soname, tipa libfoo.so.3, tako bi onda u principu obe biblioteke mogle da ostanu na kompjuteru i programi koji koriste staru biblioteku bi i dalje radili bez potrebe za novim kompajliranjem.


Citat:
combuster
3. Distribucije obicno ili ne zadrzavaju uopste matore biblioteke ili ostave samo so.ver a novu symlinkuju na .so

Onda svi programi koji su kompajlirani protiv starih biblioteka ce prestati da rade, distribucije onda rekompajliraju sve programe koje zavise od njih da bi koristili novu. Recimo libpng i libjpeg kada se bump-nu sa verzijom gomila software-a koji ih koriste se svi moraju rekompajlirati. It's a dirty work but somebody got to do it :)


Odlican kontra argument je QT. Kod njih sve minor release su binarno kompatibiline sa prethodnim bibliotekama. Kada bi svi tako vodili racuna, vjerujem da bi zivot mnogima bio laksi :).

Hvala vam svima joj jednom na pomoci!

...
 
Odgovor na temu

[es] :: Linux :: Djeljene biblioteke (shared libraries) i oznacavanje verzija

[ Pregleda: 1948 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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