Stranice: [1]   Idi dole
  Štampaj  
Autor Tema: Pravljenje biblioteke!  (Pročitano 4246 puta)
mire
Gost
« poslato: Ponedeljak, 23. Jul 2001. 11:00:00 »

Treba mi najkrace uputstvo kako da napravim svoju biblioteku u Cu (moze i C++) koji ce da sadrzi f-je koje pozivaju f-je neke druge biblioteke, i kako mogu taj novi lib kasnije da zovem iz svojih C programa (pretpostavljam da mi treba .h fajl i moja nova biblioteke kompajlirana u program).
Sačuvana
puzo
Gost
« Odgovor #1 poslato: Utorak, 24. Jul 2001. 14:45:00 »

Nisi pomenuo da li zelis da kreirs staticku (static) ili deljenju (shared) biblioteku (library). Pokusacu da u kratkim crtama objasnim kako da kreiras obe biblioteke.

Biblioteka je skup nekoliko objektnih fajlova, koja se moze koristiti kao jedan fajl u procesu linkovanja sa tvojim programom. Posto je biblioteka indeksirana mnogo je lakse koristiti nju pri linkovanju nego koristiti objektne fajlove. No, dosta o teoriji (ovo moze da ide u nedogled wink, predjimo na konkretne stvari.

Staticka biblioteka predstavlja skup objektnih fajlova koji 'zakrpljeni' koristeci program za arhiviranje ar. Kao primer uzecemo dva programa linux.c i kernel.c, gde je u programu linux.c napisana neka funkcija int linus(char *text), a u kernel.c funkcija int alan(char letter). Takodje ove dve funkcije su definisane u nekom zaglavlju pingvin.h (sadrzi samo dve linije koje sam gore napisao). Prva stvar koja je potrebna uraditi je kompajlirati program linux.c i kernel.c kao objektne fajlove (na primer gcc -c linux.c kernel.c). Tako ces dobiti dva fajla linux.o i kernel.o. Potom je potrebno arhivirati ova dva objektna fajl koristeci ar komandu i to ar crv liboops.a linux.o kernel.o. Gde je liboops.a ime biblioteke koju si kreirao. I na kraju da bi indeksirao biblioteku (iako na nekim sistemima ar to sam radi, ali ipak od viska glava ne boli wink pokreni komandu ranlib liboops.a. I tvoja staticka biblioteka je spreman za koriscenje. Ako zelis da napravis neki probni program potrebno je da uneses zaglavlje pingvin.h i iz tvog programa (recimo program.c) pozoves funkciju linus sa nekim argumentom. Potom da bi iskompajlirao samo ukucas gcc -c program.c && gcc -o program program.c -L. -loops (sigurno znas da sa prekidacem -l pozivas biblioteku, pa da ne ulazim u pricu o tome).

Ipak, staticka biblioteka ima jedan veliki problem. Zamisli da radis na nekoj 386ici gde imas 4MB memorije RAMa i sa nekih 20MB prostora na disku. Ako u isto vreme pozoves nekoliko programa koji koriste funkciju iz iste biblioteke, zavrsices sa velikim brojem kopija iste funkcije, sto znaci da ces izgubiti dragoceni sto memorijski prostor sto prostor na disku. But don't be afraid, Captain Shared is comming to rescue you. Metoda kreiranja deljene biblioteke je ista, ali ipak pri kompajliranju izvornog koda postoji nekoliko smicalica koje moraju da se ubace. Prvo pri generisanju objektnog koda potrebno je da pozoves prekidac -fPIC (pogledaj njegovo znacenje u man i info stranam, da ne bi produzavao ovu diskusiju u nedogled wink. To znaci da nase programcice linux.c i kernel.c prevodimo na sledeci nacin: gcc -fPIC -c kernel.c && gcc -fPIC -c linux.c. Posto deljenja biblioteka ne predstavlja arhivu potrebo je da je generises pomocu shared prekidaca, drugim recima: gcc -shared liboops.so linux.o kernel.o. I voila, to je to. Sada je samo potrebno da svoje programce linkujes: gcc -c program.c && gcc -o program program.o -L. -loops. Takodje potrebno je da svoj direktorijum postavis u fajl /etc/ld.so.conf ili da direktoriju gde se nalazi biblioteka liboops.so postavis u varijabli LD_LIBRARY_PATH da bi ga program nasao prilikom startovanja.

Ukoliko naidjes na neke probleme posalji problem, pa da to resimo. Nadam se da ti je ovaj nazovimo 'mini' tutorial pomogao u kreiranju biblioteka.
Sačuvana
judoka
Gost
« Odgovor #2 poslato: Četvrtak, 26. Jun 2008. 09:28:44 »

Ljudi, prvo da vas sviju pozdravim. Novi sam na forumu i uopste u svijetu linuxa.

Naime, trebam da napravim dijeljenu biblioteku .so od 5 .cpp fajlova koji imaju svoje .h fajlove. Opet tih pet fajlova koriste svoje dvije biblioteke, jednu .a i jednu .so. Dakle moja pitanja su slijedeca:
- Trebam li napraviti jos jedan .cpp (i eventualno .h fajl) u kojem cu navesti (eksportovati) funkcije koje cu da koristim iz biblioteke i kako se to eksportovanje radi. Da li treba navesti nesto kao EXPORT na mjestu gdje je definisana fja?
- Onda kad (ako) se sve to eksportuje u taj 6. .cpp fajl da li treba prilikom pravljenja biblioteke komandom g++ -shared... navesti samo njega ili i ove ostale .cpp fajlove? Odnosno da li se biblioteka pravi samo od njega jer smo u njemu naveli funkcije koje cemo korisiti ili od svih .cpp fajlova?

Hvala
Sačuvana
Stranice: [1]   Idi gore
  Štampaj  
 
Prebaci se na:  

?>