22
2. Osnove programiranja Sadrˇ zaj 2.1 Prevo denje i povezivanje izvornog koda ....... 22 2.2 GCC - GNU projekt C i C++ prevodioc ...... 23 2.2.1 Primjeri koriˇ stenja gcc prevodioca .......... 25 2.3 GNU Make - automatiziranje prevo denja ...... 29 2.3.1 Make varijable ..................... 30 2.3.2 Make pravila ...................... 30 2.3.3 Primjer makefile datoteke ............... 31 2.4 Arhive objektnih datoteka - libovi .......... 34 2.4.1 Koriˇ stenje libova .................... 34 2.4.2 Drugi naˇ cin koriˇ stenja libova ............. 35 2.4.3 Stvaranje arhiva objektnog koda ........... 35 2.4.4 GNU Ar - manipuliranje arhivama datoteka ..... 36 2.4.5 Primjer koriˇ stenja arhive ............... 37 U ovom poglavlju objasnit ´ cemo osnovne korake procesa stvaranja programske podrˇ ske, koji zapoˇ cinje sa prvom napisanom linijom izvornog koda, a realizira se u trenutku kada korisnik pokrene naˇ se najnoviju aplikaciju. Navesti ´ cemo i opisati tipove datoteka koje se u ovom postupku koriste, objasnit ´ cemo postu- pak prevo denja i povezivanja te opisati koriˇ stenje alata kojima je ove postupke mogu´ ce automatizirati. Iako se navedeni postupci i primjeri u prvom redu od- nose na razvoj programske podrˇ ske za operativni sustav UNIX u programskom jeziku C, opisani principi prevo denja i povezivanja izvornog koda u izvrˇ sni, sa manjim razlikama, vrijede za ve´ cinu operativnih sistema i kompajlerskih 1 pro- gramskih jezika. 1 Pored kompajlerskih programskih jezika, kod kojih se izvorni kod postupkom prevo denja i povezivanja pretvara u izvrˇ snu datoteku, tj. strojni kod, postoje i interpreterski jezici. Kod interpreterskih jezika naredbe izvornog koda analiziraju se i prevode u trenutku izvo denja. Dobar primjer su shell skripte

2. Osnove programiranja - marjan.fesb.hrmarjan.fesb.hr/~dkrst/unix/pdf/osnove_programiranja.pdf · Osnove programiranja Sadrˇzaj ... C++, Fortran, Java i druge programske jezike,

  • Upload
    vuliem

  • View
    258

  • Download
    4

Embed Size (px)

Citation preview

2.

Osnove programiranja

Sadrzaj

2.1 Prevodenje i povezivanje izvornog koda . . . . . . . 22

2.2 GCC - GNU projekt C i C++ prevodioc . . . . . . 23

2.2.1 Primjeri koristenja gcc prevodioca . . . . . . . . . . 25

2.3 GNU Make - automatiziranje prevodenja . . . . . . 29

2.3.1 Make varijable . . . . . . . . . . . . . . . . . . . . . 30

2.3.2 Make pravila . . . . . . . . . . . . . . . . . . . . . . 30

2.3.3 Primjer makefile datoteke . . . . . . . . . . . . . . . 31

2.4 Arhive objektnih datoteka - libovi . . . . . . . . . . 34

2.4.1 Koristenje libova . . . . . . . . . . . . . . . . . . . . 34

2.4.2 Drugi nacin koristenja libova . . . . . . . . . . . . . 35

2.4.3 Stvaranje arhiva objektnog koda . . . . . . . . . . . 35

2.4.4 GNU Ar - manipuliranje arhivama datoteka . . . . . 36

2.4.5 Primjer koristenja arhive . . . . . . . . . . . . . . . 37

U ovom poglavlju objasnit cemo osnovne korake procesa stvaranja programskepodrske, koji zapocinje sa prvom napisanom linijom izvornog koda, a realizirase u trenutku kada korisnik pokrene nase najnoviju aplikaciju. Navesti cemo iopisati tipove datoteka koje se u ovom postupku koriste, objasnit cemo postu-pak prevodenja i povezivanja te opisati koristenje alata kojima je ove postupkemoguce automatizirati. Iako se navedeni postupci i primjeri u prvom redu od-nose na razvoj programske podrske za operativni sustav UNIX u programskomjeziku C, opisani principi prevodenja i povezivanja izvornog koda u izvrsni, samanjim razlikama, vrijede za vecinu operativnih sistema i kompajlerskih1 pro-gramskih jezika.

1Pored kompajlerskih programskih jezika, kod kojih se izvorni kod postupkom prevodenja

i povezivanja pretvara u izvrsnu datoteku, tj. strojni kod, postoje i interpreterski jezici. Kod

interpreterskih jezika naredbe izvornog koda analiziraju se i prevode u trenutku izvodenja.

Dobar primjer su shell skripte

22 Osnove programiranja

2.1 Prevodenje i povezivanje izvornog koda

OBJEKTNI KOD

*.o(object files)

povezivanje(linking)

(static libraries)ARHIVE FUNKCIJA − LIBOVI

*.a

prevodenje(compiling)

IZVORNI KOD(source)

*.c

MEMORIJA

CPU

IZVRSNI KOD(executable)

DATOTEKE ZAGLAVLJA(header files)

*.h

(dynamic libraries)*.so

DINAMICKI LIBOVI

#include

Slika 2.1: Prevodenje i povezivanje

Postupak dobivanja izvrsne datoteke, tj. programa koji mozemo ucitati u me-moriju i pokrenuti, sastoji se od dva osnovna koraka i ukljucuje vise razlicitihtipova datoteka. Ovaj proces zapocinje pisanjem izvornog koda koji, u slucajuprogramskog jezika C, ukljucuju datoteke izvornog koda (datoteke sa eksten-zijom .c), i datoteke zaglavlja (ekstenzija .h). Osnovni koraci ovog procesaprikazani su na slici 2.1:

• Prevodenje (Compiling)Programski prevodioc analizira izvorni kod i prevodi ga u objektni.Ovaj postupak zapocinje obradom predprocesorom koji kod pripremaza prevodenje, dio cega je i ukljucivanje datoteka zaglavlja (.h) u izvornikod. Svaka datoteka izvornog koda prevodi se u datoteku objektnogkoda (ekstenzija .o).

• Povezivanje (Linking)Datoteke objektnog koda povezuju se u izvrsnu datoteku. Pored objek-tnih datoteka, u postupku povezivanja kao ulazne datoteke koriste se i

2.2 GCC - GNU projekt C i C++ prevodioc 23

arhive funkcija ili staticki libovi. Libovi su kolekcije objektnih datotekapohranjenih na nacin da je iz njih moguce izdvojiti objektne datotekeu izvornom obliku. Da bi u postupku povezivanja iz datoteka objekt-nog koda mogla biti generirana izvrsna datoteka, u tocno jednoj objekt-noj datoteci mora biti definirana funkcija main, koja predstavlja ulaznutocku programa.

Moderna integrirana razvojna okruzenja (Integrated Developement Envi-ronment - IDE) programeru olaksavaju postupak prevodenja izvornog kodau izvrsnu datoteku. Ovi programi automatski generiraju datoteku sa pra-vilima za prevodenje i povezivanje, a korisnik proces stvaranja izvrsne da-toteke pokrece jednostavnim odabirom opcije build. Pored automatiziranogprevodenja i povezivanja, integrirana razvojna okruzenja obicno ukljucujueditor, program za pronalazenje pogresaka (debuger), alate za automatskogeneriranje koda (wizards), alate za kreiranje korisnickog sucelja (GraphicalUser Interface - GUI) i druge dodatke koji znacajno olaksavaju i ubrzavajuproces razvoja programske podrske.Kod ovih je sustava dobar dio postupaka i koraka u stvaranju programaskriven od programera, pa mnogi, cak i iskusniji programeri slabo poznajuprocese koji su potrebni da bi od izvornog koda nastala njihova najnovijaaplikacija. Iako je ovim zivot programera znacajno olaksan, svaki progra-mer koji drzi do sebe trebao bi ovladati osnovnim principima i koracima uprevodenju i povezivanju izvornog koda, kao i shvatiti odnose medu tipovimadatoteka koje u tom procesu sudjeluju, cime stvara temelj za kvalitetniji ra-zvoj programerske vjestine.Kod razvoja programske podrske za unix, programeru je na raspolaganju viseintegriranih razvojnih okruzenja. Kvalitetno rjesenje predstavlja Kdevelop,standardni dio KDE grafickog sucelja.

2.2 GCC - GNU projekt C i C++ prevodioc

GCC, besplatan prevodioc otvorenog koda, dio je GNU2 paketa prevodiocakoji ukljucuje prevodioce za C, C++, Fortran, Java i druge programskejezike, kao i libove potrebne za povezivanje programa. Dostupan je pod GPL3

2GNU - ”GNU’s Not UNIX”, Projekt pokrenut 1984. kako bi se razvio kompletan Unixu

slican operativni sustav koji je slobodan softver.3GPL - ”General Public Licence”, GNU Opca javna licenca jamci slobodu dijeljenja i

mijenjanja slobodnih programa, kako bi program bio slobodan za sve svoje korisnike.

24 Osnove programiranja

licencom za brojne platforme sa ciljem omogucavanja razvoja prenosivog kodaza razlicite arhitekture i okruzenja.GCC prevodioc se koristi za prevodenje i povezivanje (compiling & linking)C i C++ izvornog koda.

Sintaksa

gcc [opcije] ulazne datoteke

U daljnjem tekstu navedene su osnovne opcije i tipovi datoteka koje gcc ko-risti. Detaljnu uputu za koristenje gcc prevodioca moguce je dobiti sa:

man gcc

Osnovne opcije

-c samo prevodenje, bez povezivanja (rezultat je objektna datoteka)

-Orazina razina optimizacije (0-3)

-g generira informaciju za debugger (program za pronalazenje gresaka)

-Idir ukljuci dir u listu direktorija sa datotekama zaglavlja

-Ldir ukljuci dir u listu direktorija sa arhivama objektnog koda

-Wall prikazi sva upozorenja (Warning all)

-o datoteka naziv izlazne datoteke

Ukoliko ime izlazne izvrsne datoteke nije eksplicitno navedeno opcijom -o,uobicajeno ime izvrsne datoteke je a.out.Ukoliko se koristi opcija -c, izlazna datoteka je datoteka objektnog koda. Imeobjektne datoteke stvorene iz datoteke izvornog koda imena ime.sufiks (naprimjer ime.c) je ime.o.

Ulazni tipovi datoteka

Nakon pokretanja, gcc obavlja predprocesiranje, prevodenje i povezivanje.Tipovi datoteka koji se mogu pojaviti kao ulazne datoteke zagcc ukljucuju:

• datoteka.cC izvorni kod koji je potrebno predprocesirati

2.2 GCC - GNU projekt C i C++ prevodioc 25

• datoteka.iC izvorni kod koji se ne predprocesira

• datoteka.hC ili C++ datoteka zaglavlja, obraduje se u fazi predprocesiranja

• datoteka.ccdatoteka.cpdatoteka.cppdatoteka.CPPdatoteka.cxxdatoteka.c++datoteka.CC++ izvorni kod koji je potrebno predprocesirati

• datoteka.iiC++ izvorni kod koji se ne predprocesira

• datoteka.hhdatoteka.HC++ datoteka zaglavlja, obraduje se u fazi predprocesiranja

• datoteka.odatoteka.aobjektni kod, koristi se u fazi povezivanja. Pored datoteka sa ekstenzijom.o (objektne datoteke) i .a (arhive objektnog koda), gcc sve datotekekoje ne prepoznaje kao jedan od uobicajenih ulaznih tipova (pored ovdjenavedenih postoje i drugi) tretira kao datoteke objektnog koda.

2.2.1 Primjeri koristenja gcc prevodioca

Prevodenje izvornog koda u jednoj datoteci

U datoteci pozdrav.c nalazi se izvorni kod jednostavnog programa koji is-pisuje pozdravnu poruku. Prikazano je nekoliko nacina prevodenja izvornogkoda u izvrsnu datoteku.

/> gcc -Wall pozdrav.c

/> gcc -Wall pozdrav.c -o pozdrav1

/> ls -al

26 Osnove programiranja

total 20

drwxr-xr-x 2 dkrst users 120 2006-03-15 03:31 .

drwxr-xr-x 4 dkrst users 112 2006-03-15 03:14 ..

-rwxr-xr-x 1 dkrst users 7025 2006-03-15 03:30 a.out

-rwxr-xr-x 1 dkrst users 7025 2006-03-15 03:31 pozdrav1

-rw-r--r-- 1 dkrst users 79 2006-03-15 03:15 pozdrav.c

U prvom slucaju nije navedeno ime izlazne datoteke pa izlazna datoteka do-biva uobicajeno ime a.out. U drugom slucaju koristenjem opcije -o zadanoje ime izvrsne datoteke pozdrav1. Datoteke pozdrav1 i a.out su identicne.U oba primjera koristi se opcija -Wall, koja prevodiocu nalaze da ispise sveporuke o upozorenjima.Kod stvaranja izvrsne datoteke (executable), automatski se postavljaju pravapristupa koja omogucavaju pokretanje datoteke.

Ukoliko nije eksplicitno navedeno koristenjem opcije -c, prevodioc stvara (uko-liko se ne pojavi greska) izvrsnu datoteku, tj. provodi prevodenje i povezivanjeprograma. Postupke prevodenja i povezivanja moguce je izvrsiti odvojeno sli-jedecim nizom naredbi:

/> gcc -Wall -c pozdrav.c

/> gcc -Wall pozdrav.o -o pozdrav2

/> ls -al

total 32

drwxr-xr-x 2 dkrst users 168 2006-03-15 03:44 .

drwxr-xr-x 4 dkrst users 112 2006-03-15 03:14 ..

-rwxr-xr-x 1 dkrst users 7025 2006-03-15 03:30 a.out

-rwxr-xr-x 1 dkrst users 7025 2006-03-15 03:31 pozdrav1

-rwxr-xr-x 1 dkrst users 7025 2006-03-15 03:44 pozdrav2

-rw-r--r-- 1 dkrst users 79 2006-03-15 03:15 pozdrav.c

-rw-r--r-- 1 dkrst users 892 2006-03-15 03:42 pozdrav.o

Prva naredba datoteku pozdrav.c prevodi u objektnu datoteku. Ukoliko imeizlazne datoteke nije eksplicitno navedeno, ime objektne datoteke jednako jeimenu datoteke izvornog koda cija se ekstenzija mjenja u .oU drugom koraku objektna datoteka se koristi kao ulaz. Postupak prevodenjase preskace (objektni kod je vec preveden) i obavlja se samo povezivanje. Re-zultat je izvrsna datoteka pozdrav2.Datoteke a.out, pozdrav1 i pozdrav2 su identicne.Kod pregleda sadrzaja direktorija, pored datoteke pozdrav.c i izvrsnih dato-teka a.out, pozdrav1 i pozdrav2 uocavamo i objektnu datoteku pozdrav.o

2.2 GCC - GNU projekt C i C++ prevodioc 27

Prevodenje izvornog koda koji se nalazi u vise datoteka

Prethodni primjer preraden je na nacin da je dio koda odgovoran za ispis poz-dravne poruke korisniku izdvojen u funkciju koja se nalazi u zasebnoj datoteci.U ovom slucaju, za stvaranje izvrsne datoteke potrebno je prevesti dvije da-toteke izvornog koda u objektni kod ta objektne datoteke povezati u izvrsnu.Izvorni kod nalazi se u datotekama pozdrav fn.c i funkcije1.c, a funkcijskiprototipovi u datoteci zaglavlja funkcije.h.

1 #include <stdio.h>

3 void dobar_jutar() {

printf("Dobar jutar!\n");

}

Datoteka funkcije1.c

6 #ifndef _PRIMJER2_

#define _PRIMJER2_

9 void dobar_jutar();

void slucajni_niz(int *niz, int broj_elemenata);

12 int najveci_element(int *niz, int broj_elemenata);

int najmanji_element(int *niz, int broj_elemenata);

15 #endif

Datoteka funkcije.h: dani su prototipovi 4 funkcije

#include "funkcije.h"

18 int main() {

dobar_jutar();

21 return(0);

}

Datoteka pozdrav fn.c - poziva se funkcija dobar jutar()

28 Osnove programiranja

Postupak prevodenja i povezivanja mozemo pokrenuti na vise nacina.

/> gcc -Wall pozdrav_fn.c funkcije1.c -o pozdrav_fn1

/> ls -al

total 20

drwxr-xr-x 3 dkrst users 200 2006-03-14 05:22 .

drwxr-xr-x 4 dkrst users 112 2006-03-15 03:14 ..

-rw-r--r-- 1 dkrst users 71 2006-03-14 04:52 funkcije1.c

-rw-r--r-- 1 dkrst users 67 2006-03-14 05:21 funkcije.h

-rwxr-xr-x 1 dkrst users 7156 2006-03-14 05:22 pozdrav_fn1

-rw-r--r-- 1 dkrst users 69 2006-03-14 05:21 pozdrav_fn.c

Postupak prevodenja i povezivanja pokrecemo jednom naredbom. Kao ulazu gcc koriste se datoteke izvornog koda, koje se prevode u objektni i zatimpovezuju u izvrsnu. Objektne datoteke, koje su medukorak izmedu izvornogi izvrsnog koda nisu sacuvane. U slucaju promjene izvornog koda, cijeli sepostupak ponavlja, tj. svaka od datoteka se ponovo prevodi u objektni kod ipovezuje u izvrsnu datoteku.Kao i u prethodnom primjeru, postupak prevodenja i povezivanja mozemorazdvojiti.

/> gcc -Wall -c funkcije1.c pozdrav_fn.c

/> gcc -Wall funkcije1.o pozdrav_fn.o -o pozdrav_fn2

/> ls -al

total 36

drwxr-xr-x 3 dkrst users 296 2006-03-14 05:43 .

drwxr-xr-x 4 dkrst users 112 2006-03-15 03:14 ..

-rw-r--r-- 1 dkrst users 71 2006-03-14 04:52 funkcije1.c

-rw-r--r-- 1 dkrst users 872 2006-03-14 05:43 funkcije1.o

-rw-r--r-- 1 dkrst users 67 2006-03-14 05:21 funkcije.h

-rwxr-xr-x 1 dkrst users 7156 2006-03-14 05:22 pozdrav_fn1

-rwxr-xr-x 1 dkrst users 7156 2006-03-14 05:43 pozdrav_fn2

-rw-r--r-- 1 dkrst users 69 2006-03-14 05:21 pozdrav_fn.c

-rw-r--r-- 1 dkrst users 804 2006-03-14 05:43 pozdrav_fn.o

Provm naredbom datoteke izvornog koda se prevode u objektni kod, kojise u izvrsnu datoteku povezuje drugom naredbom. Pored izvrsne datoteke,sacuvane su i datoteke objektnog koda. Ukoliko sada u izvorni kod unesemoneku izmjenu, prevesti je potrebno samo onu datoteku u kojoj su izmjene na-pravljene, i ponoviti postupak povezivanja. U slucaju slozenijih programa,sa vecim brojem datoteka izvornog koda, postupak prevodenja i povezivanja

2.3 GNU Make - automatiziranje prevodenja 29

moze se znatno skratiti ukoliko nakon svake promjene nije potrebno ponovoprevoditi cjelokupan kod. Ovo posebno dolazi do izrazaja tijekom razvojaprograma, kada cesto unosimo manje izmjene i testiramo razne varijante pro-grama.

2.3 GNU Make - automatiziranje prevodenja

U procesu razvoja programske podrske cesto se ponavlja isti ili slican slijednaredbi, i to nakon svake izmjene u izvornom kodu programa. Alat GNUMake nam omogucava automatiziranje ovog postupka. Make analizira svedatoteke u kojima se nalazi izvorni kod naseg projekta i ponovo prevodi samoone koje su mijenjane od posljednjeg prevodenja. Da bi ovo bilo moguce, po-trebno je definirati datoteku sa pravilima za prevodenje i povezivanje u kojojsu navedene ulazne datoteke projekta, odnosi medu njima i slijed naredbi ipostupaka koji se izvode kod prevodenja.Kod integriranih razvojnih okruzenja, postupak kreiranja i odrzavanja ovedatoteke obavlja razvojno okruzenje. U ovom slucaju opcije za prevodenje ipovezivanje mozemo mijenjati kroz sustav menija, a razvojno okruzenje auto-matski unosi zadane promjene u datoteku sa pravilima.

Sintaksa

make [opcije]

Detaljnu uputu za koristenje programa make moguce je dobiti sa:

man make

Osnovne opcije

-f ime datoteke Ime datoteke sa pravilima, koju nazivamo make-file. Ukoliko ova opcija nije navedena, make uradnom direktoriju trazi datoteku nazivaGNU-makefile, makefile, ili Makefile, redosljedomkojim su navedene i, ukoliko neku od navedenihdatoteka pronade, iz nje cita pravila. Ukoliko nepostoji makefile datoteka, make javlja gresku.

pravilo Izbor pravila (u jednoj makefile datoteci mozebiti navedeno vise pravila).

30 Osnove programiranja

Nakon pokretanja, rutina make ucitava datoteku sa pravilima u kojoj sunavedeni tocni postupci koje je potrebno izvrsiti za prevodenje izvornog koda uizvrsnu datoteku. U jednoj makefile datoteci moguce je definirati vise pravila,a ime pravila koje zelimo pokrenuti zadajemo kao argument naredbenog retka.Pored pravila za prevodenje i povezivanje, makefile datoteka moze sadrzavatii pravila druge namjene. Uobicajeno se u ovoj datoteci deiniraju i pravila zabrisanje nepotrebnih i privremenih datoteka, ali i slozena pravila za instalacijuprogramske podrske.

2.3.1 Make varijable

Varijabla je ime definirano unutar makefile datoteke, a vrijednost varijable jetekstualni niz (string). Varijable mogu predstavljati imena datoteka, putanjudo izvrsnih programa (npr. prevodioca), opcije za prevodenje i povezivanje,putanju do direktorija u kojima se nalaze datoteke izvornog koda, direktorijaza pohranu izvrsnih datoteka, ili imati bilo koju drugu namjenu. Koriste udrugim djelovima makefile datoteke, ukljucujuci definiciju drugih varijabli.Vrijednost varijable dohvacamo koristenjem znaka $ i imena varijable u zagra-dama. Varijabla se zamjenjuje stringom koji joj je pridruzen.

2.3.2 Make pravila

Pravila za prevodenje i povezivanje dana su u formi:

naziv pravila : ovisnosti

naredbe

...

• Kao naziv pravila najcesce se koristi ime datoteke koja nastaje kao pro-dukt izvodenja pravila. Naziv pravila moze odgovarati i akciji koju pra-vilo obavlja, ali moze biti i proizvoljno odabrano od strane programera.pravila.

• Ovisnosti (dependencies) predstavljaju datoteka koje su potrebne zaizvrsavanje pravila. Make rutina provjerava postoje li datoteke nave-dene u ovisnostima i vrijeme kada su zadnji puta mijenjane, te na osnovutoga odlucuje koje dijelove koda treba ponovo prevesti. Ukoliko dato-teke navedene u ovisnostima ne postoje, make trazi implicitna pravilaza dobivanje istih. Datoteke o kojima ovisi izvodenje pravila ne moraju

2.3 GNU Make - automatiziranje prevodenja 31

nuzno biti navedene. U ovom slucaju, pravilo se izvrsava svaki put kadaje pozvano.

• Naredbe su skup postupaka koji se izvrsavaju kada je pozvano odredenopravilo. Iako se najcesce radi o naredbama potrebnim za stvaranjeizvrsne datoteke, pravila u makefile datoteci se mogu koristiti i za drugeoperacije, kao na primjer za brisanje odredenih datoteka, ali i za opisi-vanje slozenih postupaka, kao sto je instalacija programske podrske.Vazno je naglasiti da je redak (ili vise njih) u kojem su naredbedefinirane mora biti uvucen koristenjem tipke TAB. Ukoliko seumjesto ovoga koristi obican razmak, make ce prijaviti gresku.

• Implicitna pravila se koriste za opisivanje nekih postupaka koji se izvodevrlo cesto. Ovaj tip pravila se najcesce koristi za dobivanja objektnihdatoteka iz izvornog koda. Odabir implicitnog pravila koje ce se izvrsititemelji se na imenu datoteke. Na primjer, oznaka .c.o definira impli-citno pravilo koje se koristi za dobivanje objektne datoteke (ekstenzija.o) iz datoteke C izvornog koda.

2.3.3 Primjer makefile datoteke

U slijedecem primjeru dana je datoteka sa pravilima za prevodenje i poveziva-nje primjera pozdrav i pozdrav fn koji su do sada koristeni u ovom poglavlju.Programi su prevedeni na dva nacina, kako je bilo prezentirano u ranijem tek-stu. Izvrsne datoteke pozdrav i pozdrav fn dobivene su na nacin da su se kaoulazne datoteke gcc prevodioca koristile datoteke objektnog koda, pri cemusu datoteke objektnog koda generirane koristenjem implicitnog pravila defini-ranog u 24. i 25. retku Makefile datoteke.Izvrsne datoteke pozdrav2 i pozdrav fn2 dobivene su na nacin da su kaoulazne datoteke gcc prevodioca koristene datoteke izvornog koda.

1 CC = /usr/bin/gcc

CFLAGS = -Wall

3 TARGETS = pozdrav pozdrav2 pozdrav_fn pozdrav_fn2

default: pozdrav_fn

6 all: $(TARGETS)

pozdrav: pozdrav.o

9 $(CC) $(CFLAGS) pozdrav.o -o pozdrav

32 Osnove programiranja

pozdrav2: pozdrav.c

12 $(CC) $(CFLAGS) pozdrav.c -o pozdrav2

pozdrav_fn: pozdrav_fn.o funkcije1.o

15 $(CC) $(CFLAGS) pozdrav_fn.o funkcije1.o -o pozdrav_fn

pozdrav_fn2: pozdrav_fn.c funkcije1.c

18 $(CC) $(CFLAGS) pozdrav_fn.c funkcije1.c \

-o $(BIN)/pozdrav_fn2

21 clean:

rm -f *.o *~ a.out $(TARGETS)

24 .c.o:

$(CC) $(CFLAGS) -c $<

Makefile datoteka sa pravilima za prevodenje i povezivanje

Varijable:

CC Putanja do gcc prevodioca. Promjenom sadrzaja ove vari-jable moguce je promijeniti prevodioc u svim pravilima kojasu u datoteci definirana.

CFLAGS Opcije za prevodioc

TARGETS Imena izvrsnih datoteke, koristi se u pravilima all i clean.

2.3 GNU Make - automatiziranje prevodenja 33

Pravila:

default Ovo pravilo se izvodi ukoliko je make rutina pozvana bezimena pravila, u kojem se slucaju poziva prvo pravilo koje jenavedeno. Vazno je uociti da se pravilo default ne pozivazbog svog simbolickog imena vec zbog cinjenice da je prvonavedeno praivlo u pozvanoj Makefile datoteci.

all Ukljucuje sva pravila. Pravila se izvode redom kojim sunavedena u pravilu all.

pozdrav Kao ovisnost se javlja objektna datoteka datotekapozdrav.o. Ukoliko ova datoteka ne postoji, make traziodgovarajuce implicitno pravilo. Implicitno pravilo se po-ziva i ukoliko datoteka pozdrav.o postoji, ali je starija oddatoteke primjer.c.

pozdrav2 Prevodenje i povezivanje datoteke izvornog koda pozdrav.c,koja je navedena kao ovisnost. Za definiranje naredbi koristese varijable

pozdrav fn Kao ulazne datoteke se koriste datoteke objektnog koda.U slucaju promjene u nekoj od datoteka izvornog koda,poziva se implicitno pravilo i ponovo se prevodi samo iz-mjenjena datoteka, nakon cega se ponavlja postupak po-vezivanja. Kod slozenijih programa ciji se kod moze nala-ziti u vecem broju datoteka, prevodenje samo onih dijelovakoda koji su izmjenjeni nakon zadnjeg prevodenja rezultiraznacajnim skracenjem trajanja postupka. Ovo posebno do-lazi do izrazaja u fazi razvoja programske podrske, kada secesto unose male promjene, nakon cega se program prevodii testira.

pozdrav fn2 Prevodenje programa koji se nalazi u dvije datoteke izvornogkoda jednom naredbom. U slucaju bilo kakve promjene unekoj od datoteka cijeli postupak prevodenja i povezivanjase ponavlja.

clean Brisanje privremenih, objektnih i izvrsnih datoteka.

.c.o Implicitno pravilo za prevodenje datotekaC izvornog koda uobjektne datoteke. Poziva se svaki put kada se u ovisnostimapojavi datoteka imena ime.o, ukoliko takva datoteka ne pos-toji, ili je po vremenu promjene starija od vremena promjeneodgovarajuce datoteke ime.c. U ovom slucaju izvrsava senaredba (definirana u 25. retku Makefile datoteke): gcc

-Wall -c ime.c

34 Osnove programiranja

2.4 Arhive objektnih datoteka - libovi

Arhiva objektnih funkcija (library) je jedna datoteka koja u sebi sadrzi visedatoteka objektnog koda pohranjenih na nacin da je svaku od njih moguce iz-dvojiti u njezinom izvornom obliku. Ovako organizirane arhive objektnog kodamogu se koristiti kao ulaz u programski prevodioc (u nasem slucaju gcc).Neke arhive distribuiraju se kao dio paketa programskog prevodioca i sadrze te-meljne funkcije nuzne za razvoj programske podrske. Primjer je arhiva libc.a,koja sadrzi osnovne C funkcije kao sto su printf, getc, putc, malloc i ostalefunkcije bez kojih je tesko moguc razvoj i najjednostavnijih programa. Os-tale arhive u pravilu sadrze skup funkcija orjentiranih na rjesavanje odredeneproblematike (na primjer funkcije za mreznu komunikaciju ili obradu slika), amogu biti distribuirane u paketu sa prevodiocem, ili odvojeno. Koristenjemvec pripremljenih funkcija programera oslobada potrebe da svoj program ra-zvija ”od nule” pa je prije upustanja u kodiranje uvijek korisno provjeritipotoji li lib koji nam moze olaksati zivot i ustedjeti vrijeme i trud.

2.4.1 Koristenje libova

Lib kao ulaz u prevodioc koristimo na isti nacin kao i objektnu datoteku. Naprimjer, naredba:

gcc program.c nekilib.a -o program

kao ulaz u prevodioc koristi datoteku izvornog koda program.c i libnekilib.a. Datoteka program.c se prevodi u objektni kod (funkcije u libuvec jesu objektni kod), nakon cega se povezuje sa objektnim datotekama kojesu dio navedene arhive, a koje su potrebne za stvaranje izvrsne datotekeprogram. Pri pozivanju prevodioca nije potrebno eksplicitno navesti ranijespomenutu arhivu libc.a koja je gotovo uvijek potrebna pa se automatskikoristi u povezivanju.

Kada je kao ulaz u prevodioc naveden lib, on se trazi u radnom direkto-riju i listi direktorija sa arhivama objektnog koda. Ova lista na unix sis-temu obicno ukljucuje direktorij /usr/lib, a moze se prosiriti opcijom-Lime direktorija (vidi poglavlje 2.2).Kod koristenja arhiva objektnog koda vazan je i redosljed kojem su ulaznedatoteke navedene u naredbi koja poziva gcc. Naime, u svakoj arhivi mozebiti vise objektnih datoteka, a prevodioc izdvaja samo one koje sadrze funk-

2.4 Arhive objektnih datoteka - libovi 35

cije potrebne za generiranje izvrsne datoteke. Kada pokrenemo gcc, datotekese analiziraju onim redosljedom kojim su navedene u naredbenom retku pricemu se stvara lista potrebnih funkcija. Funkcije koje nedostaju traze se u li-bovima koje slijede u naredbenom retku, iz kojih se izdvajaju samo oni djeloviobjektnog koda koji sadrze potrebne funkcije. Ukoliko je neka arhiva navedenaranije od funkcijskog poziva koji koristi dio objektnog koda arhive, ovaj diokoda nece biti izdvojen iz liba i gcc ce prijaviti gresku u procesu povezivanja.Dobra je praksa arhive objektnog koda staviti na kraju liste datoteka koje suulaz u gcc prevodioc, a posebno je potrebno voditi racuna o redosljedu akokoristimo vise od jednog liba pri cemu postoji mogucnost da neka od funkcijaiz jedne arhive koristi funkcije iz neke druge. U ovom slucaju uvijek moramolib ”vise razine”, tj. onaj koji koristi funkcije iz neke druge arhive, stavitiranije u listi datoteka.

2.4.2 Drugi nacin koristenja libova

Kada je ime liba dano u obliku libime.a, a nalazi se u nekom od direktorijanavedenim u listi direktorija sa arhivama objektnog koda, umjesto navodenjaputanje do zeljenog liba moze se koristiti opcija gcc prevodioca -lime. Uko-liko, na primjer, u proces povezivanja zelimo ukljuciti arhivu libjpeg.a ukojoj se nalazi objektni kod funkcija za manipuliranje slikama u jpeg formatu,mozemo koristiti slijedecu sintaksu:

gcc -Wall prog.o -ljpeg -o izvrsna

Ukoliko direktorij sa datotekom libjpeg.a nije u listi direktorija sa arhivamaobjektnog koda, sintaksa naredbe bi izgledala ovako:

gcc -Wall -L/putanja/na/direktorij prog.o -ljpeg -o izvrsna

2.4.3 Stvaranje arhiva objektnog koda

Pored koristenja arhiva objektnog koda koje su pripremili drugi programeri,jednostavno je i stvaranje novih libova u kojima mozemo pohraniti svoje funk-cije. Ovo je dobra praksa ukoliko cesto koristimo neke djelove koda. Arhivi-ranjem funkcija u lib sistematiziramo kod koji smo ranije razvili na nacin daumjesto velikog broja objektnih datoteka koristimo jednu ili vise tematskih

36 Osnove programiranja

arhiva. Vjerovatno najlosija praksa je kopiranje izvornog koda u svaki noviprojekt, pri cemu se vrlo lako izgubiti u sumi izmjena koje unosimo u razlicitimverzijama.Osim za osobne primjene, arhive mozemo ponuditi na koristenje i drugim pro-gramerima, bilo kao dio slobodnog softwarea, ili kao komercijalni proizvod. Naovaj nacin omogucavamo distribuciju i koristenjene svojih funkcija bez potrebeda, ukoliko to ne zelimo, otkrivamo izvorni kod. Naravno, funkcije je mogucedistribuirati i u objektnom obliku (sto je prakticki isto), ali tada umjesto sajednom manipuliramo sa vecim brojem datoteka.

2.4.4 GNU Ar - manipuliranje arhivama datoteka

Program ar koristimo za stvaranje i manipuliranje arhivama datoteka. Uarhivi datoteke sacuvan je sadrzaj, vlasnistvo, prava i vremena pristupa svakepojedine datoteke koja na zahtjev moze biti izdvojena iz arhive. Iako se mozekoristiti za razne namjene, ar se najcesce koristi za manipuliranje arhivamaobjektnog koda.

Sintaksa

ar [-opcije] arhiva [ulazne datoteke]

Detaljnu uputu za koristenje ar rutine moguce je dobiti sa:

man ar

Osnovne opcije

r Dodavanje nove ili zamjena postojece datoteke u arhivi.Ukoliko u arhivi postoji clan sa istim imenom, prije dodava-nja novog, postojeci clan se brise iz arhive.

d Brisanje datoteke clana iz arhive.

x Izdvajanje datoteke clana iz arhive.

t Ispis liste datoteka clanova arhive.

v Mod rada sa ispisom dodatnih informacija (verbose).

2.4 Arhive objektnih datoteka - libovi 37

2.4.5 Primjer koristenja arhive

U datoteci funkcije2.c dan je izvorni kod funcije za generiranje niza slucajnihbrojeva, te dvije funkcije za pronalazenje najveceg i najmanjeg elementa niza:

1 #include <stdlib.h>

3 /*

*

* Generira slucajni niz duzine broj_elemenata

6 *

*/

void slucajni_niz(int *niz, int broj_elemenata) {

9 int i;

for (i=0; i<broj_elemenata; i++)

niz[i] = rand();

12 }

/*

15 *

* Pronalazi najveci element u nizu

*

18 */

int najveci_element(int *niz, int broj_elemenata) {

int i, maxel = niz[0];

21

for (i=1; i<broj_elemenata; i++) {

if (maxel < niz[i])

24 maxel = niz[i];

}

27 return(maxel);

}

30 /*

*

* Pronalazi najmanji element u nizu

33 *

*/

int najmanji_element(int *niz, int broj_elemenata) {

36 int i, minel = niz[0];

38 Osnove programiranja

for (i=1; i<broj_elemenata; i++) {

39 if (minel > niz[i])

minel = niz[i];

}

42

return(minel);

}

Datoteka funkcije2.c

Funkcijski prototipovi navedenih funkcija navedeni su u vec prikazanoj da-toteci funkcije.h. Izvorni kod programa koji koristi ove funkcije dan je udatoteci niz.c:

1 #include <stdio.h>

#include "funkcije.h"

3 #define N_EL 10

int main() {

6 int i, mx, mi;

int niz[N_EL];

9 slucajni_niz(niz, N_EL);

printf("Elementi niza:\n");

printf("----------------\n");

12

for (i=0; i<N_EL; i++)

printf("%3d.element: %12d\n", i+1, niz[i]);

15

mx = najveci_element(niz, N_EL);

mi = najmanji_element(niz, N_EL);

18 printf("\n\nMax: %d; Min:%d\n",mx, mi);

return(0);

21 }

Datoteka niz.c

Izvrsnu datoteku programa mozemo dobiti sa:

2.4 Arhive objektnih datoteka - libovi 39

/> gcc -Wall niz.c funkcije2.c -o niz

Prevodenje programa mozemo rijesiti i dodavanjem slijedeceg pravila u ranijestvorenu Makefile datoteku:

niz1: niz.o funkcije2.o

$(CC) $(CFLAGS) niz.o funkcije2.o -o $(BIN)/niz1

Stvaranje arhive funkcija

Pokusajmo sada kreirati lib sa funkcijama danim u datotekama funkcije1.c

i funkcije2.c. U ovoj bi arhivi trebale biti pohranjene ukupno cetiri funkcijeu dvije objektne datoteke (funkcije1.o i funkcije2.o). Prvi korak jeprevodenje datoteka izvornog koda u objektni kod (gcc opcija -c):

/> gcc -Wall -c funkcije1.c funkcije2.c

Iz objektnih funkcija stvaramo lib koristenjem rutine ar sa opcijom -r (doda-vanje ili zamjena objektnih datoteka u arhivi). Ukoliko arhiva ne postoji, arstvara novu arhivu:

/> ar -r mojlib.a funkcije1.o funkcije2.o

ar: creating mojlib.a

Izvrsnu datoteku sada mozemo generirati na slijedeci nacin:

/> gcc -Wall niz.c mojlib.a -o niz2

Kada prevodioc pokrenemo na ovaj nacin, iz arhive mojlib.a se rekons-tuira objektna datoteka funkcije2.o u kojoj su definirane funkcije potrebneza povezivanje u izvrsnu datoteku programa. Ova naredba u osnovi je jednakanaredbi:

/> gcc -Wall niz.c funkcije2.o -o niz2

40 Osnove programiranja

Make pravila

Postupak stvaranja arhive objektnog koda mozemo automatizirati dodavanjempravila u postojecu Makefile datoteku. Takoder, mozemo definirati i pravilaza prevodenje i povezivanje primjera opisanih u ovom poglavlju na nacin daumjesto datoteka objektnog koda koriste lib. Konacni izgled Makefile dato-teke dan je u slijedecem listingu:

1 CC = /usr/bin/gcc

AR = /usr/bin/ar

3 CFLAGS = -Wall

LIBDIR = .

6 TARGETS = pozdrav pozdrav2 pozdrav_fn pozdrav_fn2 \

pozdrav_fn3 niz niz2

9 default: niz

all: $(TARGETS) mojlib

12 pozdrav: pozdrav.o

$(CC) $(CFLAGS) pozdrav.o -o pozdrav

15 pozdrav2: pozdrav.c

$(CC) $(CFLAGS) pozdrav.c -o pozdrav2

18 pozdrav_fn: pozdrav_fn.o funkcije1.o

$(CC) $(CFLAGS) pozdrav_fn.o funkcije1.o -o pozdrav_fn

21 pozdrav_fn2: pozdrav_fn.c funkcije1.c

$(CC) $(CFLAGS) pozdrav_fn.c funkcije1.c -o pozdrav_fn2

24 pozdrav_fn3: pozdrav_fn.o

$(CC) $(CFLAGS) pozdrav_fn.o $(LIBDIR)/mojlib.a -o pozdrav_fn3

27 niz: niz.o funkcije2.o

$(CC) $(CFLAGS) niz.o funkcije2.o -o niz

30 niz2: niz.o

$(CC) $(CFLAGS) niz.o $(LIBDIR)/mojlib.a -o niz2

33 mojlib: funkcije1.o funkcije2.o

2.4 Arhive objektnih datoteka - libovi 41

$(AR) -r $(LIBDIR)/mojlib.a funkcije1.o funkcije2.o

36 clean:

rm -f *.o *~ a.out $(TARGETS)

39 cleanall:

rm -f *.o *~ a.out $(TARGETS) $(LIBDIR)/mojlib.a

42 .c.o:

$(CC) $(CFLAGS) -c $<

Konacni oblik Makefile datoteke

U Makefile datoteku dodana su slijedeca pravila:

pozdrav fn3 Pravilo za prevodenje primjera pozdrav fn u kojem seumjesto objektne datoteke funkcije1.o koristi arhivaobjektnog koda mojlib.a

niz Prevodenje primjera niz. Funkcije za manipuliranje nizomnalaze se u datoteci funkcije2.o

niz2 Datoteka objektnog koda funkcije2.o sa funkcijama zamanipuliranje nizom uzima se iz arhive mojlib.a

mojlib Pravilo za stvaranje arhive mojlib.a. U ovisnostimasu navedene datoteke objektnog koda funkcije1.o ifunkcije2.o. Make provjerava postoje li navedene dato-teke i njihova vremena kreiranja, te po potrebi poziva impli-citno pravilo za prevodenje izvornog u objektni kod. Nakonstvaranja objektnih datoteka, izvrsava se naredba:

ar -r ./mojlib.a funkcije1.o funkcije2.o

Naredba se formira koristenjem dviju novih varijabli: Vari-jabla AR (drugi redak makefile datoteke) definira putanju doar rutine. Varijabla LIBDIR (sesti redak) odreduje direk-torij u koji se pohranjuje arhiva. Ista varijabla koristi se ikod povezivanja programa koji funkcije uzimaju iz arhive.

cleanall Pored izvrsnih, objektnih i privremenih datoteka, brise i ar-hivu mojlib.a

42 Osnove programiranja