Kompilacia programov: prikaz gcc


gcc prepinace subor

Najdolezitejsie prepinace su:
-c Len kompiluje, inak aj linkuje vykonatelny subor
-o meno Vysledok kompilacie (linkovania) bude generovat do suboru meno
-Iadresar Specifikuje #include adresar
-Dmakro Preddefinuje makro
-O Optimizacia generovaneho kodu
   
-E -MM (MakeMake, len gcc) generuje cast make suboru s popisom zavislosti medzi subormi



Zostavovanie zlozitejsieho projektu: prikaz make a subor Makefile

make Precita popis zavislosti v programe zo suboru "Makefile" a podla neho zostavi program (v skutocnosti prvy definovany ciel v Makefile).
make ciel Precita popis zavislosti v programe zo suboru "Makefile" a podla neho zostavi ciel ciel definovany v Makefile.

Subor Makefile (napisany uzivatelom) popisuje zavislosti medzi subormi. Popisuje napriklad, ktore subory treba prekompilovat v pripade, ze sa zmeni niektory zdrojovy text. Popri tom popisuje aj ako sa vyrobi nova verzia daneho suboru, t.j. napriklad akym prikazom sa dany program skompiluje.

Subor Makefile obsahuje postupnost pozostavajucu z piatich moznych veci:

  • komentar: (akykolvek riadok zacinajuci znakom #).

  • include directiva: klucove slovo 'include' nasledovane menom suboru sposobi vlozenie textu daneho suboru (podobne ako v jazyku C).

  • definicia premennej: identifikator nasledovany znakom = a hodnotou premennej. K hodnote premennej mozno potom pristupovat ak sa jej meno pouzije s prefixom $, t.j. $meno, alebo $(meno), podobne ako v shell scriptoch.

  • explicitne pravidlo:
    Pravidlo je zvycajne zviazane s jednym suborom a pozostava z dvoch casti urcujucich:
    • kedy (t.j. v pripade zmeny akych inych suborov) treba subor pregenerovat.
    • prikaz, ktory by mal vygenerovat novu verziu suboru (riadok s prikazom musi zacinat znakom 'tabulator' (== ^I)).
    Napriklad nasledovny subor Makefile:
    main.o:	main.c header.h
    	gcc -c -o main.o main.c
    main:	main.o
    	gcc -o main main.o
    
    specifikuje, ze v pripade, ze sa zmeni subor main.c alebo subor header.h, tak treba pregenerovat subor main.o. Nova verzia suboru main.o sa vyrobi vykonanim prikazu 'gcc -c -o main.o main.c'. Dalej tento Makefile specifikuje, ze v pripade, ze sa zmeni subor main.o', tak treba pregenerovat subor 'main'. Novu verziu tohto suboru vyrobi prikaz 'gcc -o main main.o'.

  • implicitne pravidlo:
    Velmi komplikovana forma, ako zadavat genericke pravidla typu: Ak chces ziskat subor s koncovkou .o z nejakeho suboru s koncovkou .c musis spustit prikaz '$(CC) -c $(CPPFLAGS) $(CFLAGS)' (navyse sa predpoklada, ze uzivatel definoval premenne CC, CPPFLAGS a CFLAGS). Vacsina takychto pravidiel je predpripravena a zabudovana priamo v prikaze make.

Priklady Makefile suborov: Makefile1 Makefile2









Cvicenia





1.) Subor archiv.tgz, ktory dostanete na diskete, obsahuje tri subory. Namontujte disketu, skopirujte subor do svojho domovskeho adresara a rozbalte ho.


2.) Zistite ako sa jednotlive subory z archivu lisia.


3.) Preskusajte ako sa lisi vystup prikazu diff v zavislosti od prepinacov -e, -c


4.) Predpokladajme ze subory 'subor2.c' a 'subor3.c' vznikly nezavislou editaciou suboru 'subor1.c'. Vyrobte novu verziu suboru1, ktora bude obsahovat vsetky zmeny prevedene na subore1, t.j aj zmeny vzniknute prechodom subor1.c -> subor2.c aj zmeny z prechodu subor1.c -> subor3.c


5.) Zapiste vysledny subor1.c na disketu a odmontujte ju.