Vjezba 2:Programiranje za UNIX
Da bi neki program u UNIX sustavu kompajlirali treba nam neki compiler.
Trenutni compiler koji koristimo na adrii je gcc.
GCC (GNU C Compiler) je besplatni C prevodioc otvorenog koda.
Vrlo je jednostavan za korištenje i sintaksa mu izgleda ovako:
      gcc [opcije] [izvorni_kod] -o [izlazni_fajl] gdje izlazni_fajl znaci
ime programa.
Neke opcije:
    -Wall - nam služi za prikaz svih mogućih upozorenja tijekom prevođenja programa.
    -g - generira program sa informacijom za debuger.
    -c - samo prevođenje (kompiliranje),bez povezivanja (linkanja).
Ulazne datoteke za gcc mogu biti:
- Datoteke s izvornim kodom (source files).
- Objektne datoteke (object files).
- Datoteke funkcija (libraries).
Ako hocemo prevesti datoteku program.c u objektnu datoteku upisujemo slijedeću komandu:
    gcc -Wall -c program.c -o program.o
Da bi dobili izvrsnu datoteku imena program iz objektne trebamo upisati:
    gcc -Wall program.o -o program
Za dobiti izvrsnu datoteku direktno iz izvorne datoteke pisemo:
    gcc -Wall program.c -o program
Ako se program sastoji od vise izvornih datoteka tada pisemo:
    gcc -Wall program.c funkcija.c -o program
GCC kompajlira zajedno te dvije datoteke i stvara izvrsni program iz njih.
Na isti način se dobijaju i objektne datoteke.
Da bi se prevođenje moglo odraditi automatski koristimo make
utility.
Make čita naredbe po defaultu iz datoteke
Makefile i izvršava ih.
Datoteka se moze zvati kako
mi hoćemo u
tome slučaju je moramo navesti nakon komande make:
make -f [ime datoteke]
Makefile datoteka:
- Opisuje odnose između datoteka u programu.
- Definira skup naredbi za prevođenje za svaku datoteku.
Makefile se sastoji od skupa pravila sa slijedećom
strukturom:
      target : dependencies
     
           commands
- target - naziv programa kojeg želimo prevesti.
- dependencies - datoteke o kojima ovisi prevođenje.
- command - akcija koju make poduzima za generiranje
datoteke.
Prije komandi obevezno je stisniti [TAB].
Make varijable:
Varijabla je simboličko ime definirano u Makefile
datoteci i predstavlja tekstualni string.
OPTIONS = -v -g
Gdje je OPTIONS ime varijable a -g -v
pohranjeni string.
Za dobivanje vrijednosti varijable koristi se oznaka dolara $ iza
koje slijedi
naziv varijable u zagradama:
$(OPTIONS)
Primjer Makefile datoteke:
   CC = /usr/bin/gcc
   CFLAGS = -Wall -g
   BINDIR = bin
   LIBDIR = lib
   default: count
   all : hello count
   hello : hello.c
          $(CC) $(CFLAGS) hello.c -o $(BINDIR)/hello
   count : count.c
   $(CC) $(CFLAGS) count.c $(LIBDIR)/firstlib.a \
   -o $(BINDIR)/count
   clean :
   rm -f *.o *~ $(BINDIR)/*
Zadatak:
U direktoriju unix/vjezbe stvorio sam datoteku
hello.c
u kojoj se nalazi izvorni kod programa koji na
ekran ispisuje
poruku "Zdravo svima!".Izvorni kod sam preveo u
objektnu datoteku slijedećom komandom:
gcc -Wall -c hello.c -o hello.o
Da bi dobio izvrsnu iz objektne datoteke upisujem:
gcc -Wall hello.o -o hello
Tada je stvorena izvrsna datoteka te se moze pokrenuti s ./hello:
adria:~/unix/vjezbe> ./hello
Zdravo svima!
adria:~/unix/vjezbe>
Slijedeće sam napravio dvije izvorne datoteke.U jednoj se nalazi funkcija a u drugoj jednostavno pozivamo tu
funkciju.
Funkcija ispisuje na ekran poruku "Zdravo svima!".
Da bi preveo dvije datoteke koristio sam:
gcc -Wall -c hello2.c func.c -o hello2.o func.o
pa:
gcc -Wall hello2.o func.o -o hello2
Moze i direktno:
gcc -Wall hello2.c func.c -o hello2
Program se pokrece s ./hello2 i ima isti učinak kao i gornji program.
Makefile datoteka
Makefile datoteku sam napravio na slijedeći način:
pico Makefile
Onda sam u nju upisao neke osnovne varijable, koja se akcija izvodi po defaultu i ostale akcije.
objekt : hello.c
        $(CC) $(CGLAGS) -c hello.c - s naredbom make objekt stvaramo
samo objektnu datoteku iz hello.c.
prog : hello.c
        $(CC) $(CFLAGS) hello.o -o hello - s naredbom make prog
direktno prevodimo hello.c izvornu u izvršnu.
clean :
        rm -f *.o *~ - naredbom make clean brišemo sve objektne i
izvršne datoteke u direktoriju.
Drago Glibota 2005,511-204