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:

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:

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