Professional Documents
Culture Documents
Osnove Programiranja PDF
Osnove Programiranja PDF
Osnove programiranja
Sadržaj
2.1 Prevodenje i povezivanje izvornog koda . . . . . . . 22
2.2 GCC - GNU projekt C i C++ prevodioc . . . . . . 23
2.2.1 Primjeri korištenja 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 Korištenje libova . . . . . . . . . . . . . . . . . . . . 34
2.4.2 Drugi način korištenja libova . . . . . . . . . . . . . 35
2.4.3 Stvaranje arhiva objektnog koda . . . . . . . . . . . 35
2.4.4 GNU Ar - manipuliranje arhivama datoteka . . . . . 36
2.4.5 Primjer korištenja arhive . . . . . . . . . . . . . . . 37
povezivanje
(linking)
DINAMICKI LIBOVI
(dynamic libraries) CPU
*.so
Postupak dobivanja izvršne datoteke, tj. programa koji možemo učitati u me-
moriju i pokrenuti, sastoji se od dva osnovna koraka i uključuje više različitih
tipova datoteka. Ovaj proces započinje pisanjem izvornog koda koji, u slučaju
programskog jezika C, uključuju datoteke izvornog koda (datoteke sa eksten-
zijom .c), i datoteke zaglavlja (ekstenzija .h). Osnovni koraci ovog procesa
prikazani su na slici 2.1:
• Prevodenje (Compiling)
Programski prevodioc analizira izvorni kod i prevodi ga u objektni.
Ovaj postupak započinje obradom predprocesorom koji kod priprema
za prevodenje, dio čega je i uključivanje datoteka zaglavlja (.h) u izvorni
kod. Svaka datoteka izvornog koda prevodi se u datoteku objektnog
koda (ekstenzija .o).
• Povezivanje (Linking)
Datoteke objektnog koda povezuju se u izvršnu datoteku. Pored objek-
tnih datoteka, u postupku povezivanja kao ulazne datoteke koriste se i
2.2 GCC - GNU projekt C i C++ prevodioc 23
Sintaksa
Osnovne opcije
Ukoliko ime izlazne izvršne datoteke nije eksplicitno navedeno opcijom -o,
uobičajeno ime izvršne datoteke je a.out.
Ukoliko se koristi opcija -c, izlazna datoteka je datoteka objektnog koda. Ime
objektne datoteke stvorene iz datoteke izvornog koda imena ime.sufiks (na
primjer ime.c) je ime.o.
• datoteka.c
C izvorni kod koji je potrebno predprocesirati
2.2 GCC - GNU projekt C i C++ prevodioc 25
• datoteka.i
C izvorni kod koji se ne predprocesira
• datoteka.h
C ili C++ datoteka zaglavlja, obraduje se u fazi predprocesiranja
• datoteka.cc
datoteka.cp
datoteka.cpp
datoteka.CPP
datoteka.cxx
datoteka.c++
datoteka.C
C++ izvorni kod koji je potrebno predprocesirati
• datoteka.ii
C++ izvorni kod koji se ne predprocesira
• datoteka.hh
datoteka.H
C++ datoteka zaglavlja, obraduje se u fazi predprocesiranja
• datoteka.o
datoteka.a
objektni kod, koristi se u fazi povezivanja. Pored datoteka sa ekstenzijom
.o (objektne datoteke) i .a (arhive objektnog koda), gcc sve datoteke
koje ne prepoznaje kao jedan od uobičajenih ulaznih tipova (pored ovdje
navedenih postoje i drugi) tretira kao datoteke objektnog koda.
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 slučaju nije navedeno ime izlazne datoteke pa izlazna datoteka do-
biva uobičajeno ime a.out. U drugom slučaju korištenjem opcije -o zadano
je ime izvršne datoteke pozdrav1. Datoteke pozdrav1 i a.out su identične.
U oba primjera koristi se opcija -Wall, koja prevodiocu nalaže da ispiše sve
poruke o upozorenjima.
Kod stvaranja izvršne datoteke (executable), automatski se postavljaju prava
pristupa koja omogućavaju pokretanje datoteke.
Ukoliko nije eksplicitno navedeno korištenjem opcije -c, prevodioc stvara (uko-
liko se ne pojavi greška) izvršnu datoteku, tj. provodi prevodenje i povezivanje
programa. Postupke prevodenja i povezivanja moguće je izvršiti odvojeno sli-
jedećim nizom naredbi:
1 #include <stdio.h>
3 void dobar_jutar() {
printf("Dobar jutar!\n");
}
Datoteka funkcije1.c
6 #ifndef _PRIMJER2_
#define _PRIMJER2_
9 void dobar_jutar();
15 #endif
#include "funkcije.h"
18 int main() {
dobar_jutar();
21 return(0);
}
može se znatno skratiti ukoliko nakon svake promjene nije potrebno ponovo
prevoditi cjelokupan kod. Ovo posebno dolazi do izražaja tijekom razvoja
programa, kada često unosimo manje izmjene i testiramo razne varijante pro-
grama.
U procesu razvoja programske podrške često se ponavlja isti ili sličan slijed
naredbi, i to nakon svake izmjene u izvornom kodu programa. Alat GNU
Make nam omogućava automatiziranje ovog postupka. Make analizira sve
datoteke u kojima se nalazi izvorni kod našeg projekta i ponovo prevodi samo
one koje su mijenjane od posljednjeg prevodenja. Da bi ovo bilo moguće, po-
trebno je definirati datoteku sa pravilima za prevodenje i povezivanje u kojoj
su navedene ulazne datoteke projekta, odnosi medu njima i slijed naredbi i
postupaka koji se izvode kod prevodenja.
Kod integriranih razvojnih okruženja, postupak kreiranja i održavanja ove
datoteke obavlja razvojno okruženje. U ovom slučaju opcije za prevodenje i
povezivanje možemo mijenjati kroz sustav menija, a razvojno okruženje auto-
matski unosi zadane promjene u datoteku sa pravilima.
Sintaksa
make [opcije]
Detaljnu uputu za korištenje programa make moguće je dobiti sa:
man make
Osnovne opcije
• Kao naziv pravila najčešće se koristi ime datoteke koja nastaje kao pro-
dukt izvodenja pravila. Naziv pravila može odgovarati i akciji koju pra-
vilo obavlja, ali može biti i proizvoljno odabrano od strane programera.
pravila.
nužno biti navedene. U ovom slučaju, pravilo se izvršava svaki put kada
je pozvano.
• Naredbe su skup postupaka koji se izvršavaju kada je pozvano odredeno
pravilo. Iako se najčešće radi o naredbama potrebnim za stvaranje
izvršne datoteke, pravila u makefile datoteci se mogu koristiti i za druge
operacije, kao na primjer za brisanje odredenih datoteka, ali i za opisi-
vanje složenih postupaka, kao što je instalacija programske podrške.
Važno je naglasiti da je redak (ili više njih) u kojem su naredbe
definirane mora biti uvučen korištenjem tipke TAB. Ukoliko se
umjesto ovoga koristi običan razmak, make će prijaviti grešku.
• Implicitna pravila se koriste za opisivanje nekih postupaka koji se izvode
vrlo često. Ovaj tip pravila se najčešće koristi za dobivanja objektnih
datoteka iz izvornog koda. Odabir implicitnog pravila koje će se izvršiti
temelji 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.
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
21 clean:
rm -f *.o *~ a.out $(TARGETS)
24 .c.o:
$(CC) $(CFLAGS) -c $<
Varijable:
Pravila:
Arhiva objektnih funkcija (library) je jedna datoteka koja u sebi sadrži više
datoteka objektnog koda pohranjenih na način da je svaku od njih moguće iz-
dvojiti u njezinom izvornom obliku. Ovako organizirane arhive objektnog koda
mogu se koristiti kao ulaz u programski prevodioc (u našem slučaju gcc).
Neke arhive distribuiraju se kao dio paketa programskog prevodioca i sadrže te-
meljne funkcije nužne za razvoj programske podrške. Primjer je arhiva libc.a,
koja sadrži osnovne C funkcije kao što su printf, getc, putc, malloc i ostale
funkcije bez kojih je teško moguć razvoj i najjednostavnijih programa. Os-
tale arhive u pravilu sadrže skup funkcija orjentiranih na rješavanje odredene
problematike (na primjer funkcije za mrežnu komunikaciju ili obradu slika), a
mogu biti distribuirane u paketu sa prevodiocem, ili odvojeno. Korištenjem
već pripremljenih funkcija programera oslobada potrebe da svoj program ra-
zvija ”od nule” pa je prije upuštanja u kodiranje uvijek korisno provjeriti
potoji li lib koji nam može olakšati život i uštedjeti vrijeme i trud.
Lib kao ulaz u prevodioc koristimo na isti način kao i objektnu datoteku. Na
primjer, naredba:
Sintaksa
Osnovne opcije
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
Datoteka funkcije2.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
Make pravila
1 CC = /usr/bin/gcc
AR = /usr/bin/ar
3 CFLAGS = -Wall
LIBDIR = .
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
24 pozdrav_fn3: pozdrav_fn.o
$(CC) $(CFLAGS) pozdrav_fn.o $(LIBDIR)/mojlib.a -o pozdrav_fn3
30 niz2: niz.o
$(CC) $(CFLAGS) niz.o $(LIBDIR)/mojlib.a -o niz2
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 $<