Sunteți pe pagina 1din 5

Lucrarea nr.

10 Makele-uri
Scopul acestei lucrri este elegerea modului de functionare al utilitarului make i a nt s cunoaterea modului organizare a ierelor Makele. s s

10.1.

Structura ierelor Makele s

Aplicatiile complexe C sub Linux contin, majoritatea cazurilor, un numr mare de n n a iere surs. De asemenea, multe cazuri, compilarea ierelor surs necesit mai multe s a n s a a comenzi, ecare avnd un numr mare de opttiuni. Dac aplicatia se a stadiul de a a a a n dezvoltare, orice testare va necesita compilarea tuturor surselor. Astfel, anumite cazuri, n procesul de compilare poate dura mai mult dect cel de programare. a Pentru a simplica procesul de compilare, special cazul aplicatiilor cu surse muln n tiple, se recomand utilizarea ierelor Makele respectiv a utilitarului make. a s Fiierele Makele sunt iere text asociate utilitarului make care contin macro-uri i s s s comenzi pentru compilarea aplicatiilor (C, C++, etc). Macro-urile dintr-un ier Makele reprezint variabile pe care utilizatorul le poate s a folosi pentru compilarea aplicatiilor. Acestora li se pot atribui valori ca i cazul scrip s n turilor Shell, adic variabil=valoare. Macro-urile predenite sunt: a a CC - numele compilatorului OBJS - numele ierelor obiect (.o) care se vor genera s CFLAGS - optiunile utilizate pentru compilarea ierelor surs (ex: -c -Wall ) s a LFLAGS - optiunile utilizate pentru generarea executabilului (ex: -lm -Wall ) Pe lng macro-uri, ierele Makele se denesc i ierele target, astfel: a a n s s s target: dependinte <TAB> commanda Target reprezint numele ierului care trebuie generat iar dependinte reprezint a s a numele ierului sau ierelor de care depinde ierul target. s s s Fiierele Makele se vor scrie dup urmtoarele reguli: macro-urile se vor scrie s a a ntotdeauna cu litere mari; comenzile pentru generarea ierelor target vor precedate de TAB ; comens zile vor scrise pe baza macro-urilor, dup urmtoarea sintax: a a a <TAB> $(MACROx) $(MACROy) optiuni $(MACROz) ... $(MACROxx) exemplu: $(CC) -o ex1 $(LFLAGS) $(OBJS)

63

Bazele Utilizrii Calculatoarelor a

Astfel, structura unui ier Makele este urmtoarea: s a MACRO1=valoare ... MACROn=valoare target1: dependinte <TAB> comenzi ... targetN: dependinte <TAB> comenzi

10.2.

Compilarea aplicatiilor C cu utilitarul make

Compilarea aplicatiilor dup scrierea ierului Makele se va face cu comanda make a s target. Not: target poate reprezenta i un cuvnt cheie folosit pentru operatii suplimentare a s a asupra aplicatiei. De exemplu, pentru tregerea ierelor obiect dup generarea ierului s s a s executabil se poate folosi: clean: rm -rf *.o Prin apelarea comenzii make clean, se vor sterge toate ierele cu extensia .o din s directorul curent. Exemplul 1 - S se creeze un ier Makele pentru compilarea urmtorului program a s a C (ex1.c): #include <stdio.h> #include <math.h> int main() { int u=45; double res; res = sin((u*3.14)/180); printf("sin(%d) = %lf\n", u, res); return 0; }

64

Lucrarea nr. 10

Makele: OBJS= ex1.o CC= gcc CFLAGS= -c -Wall LFLAGS = -lm -Wall ex1.o: ex1.c $(CC) $(CFLAGS) ex1.c ex1: $(OBJS) $(CC) $(LFLAGS) $(OBJS) -o ex1 clean: rm -rf *.o ex1 compilare: root@slax:~# make ex1 gcc -c -Wall ex1.c gcc -lm -Wall ex1.o -o ex1 root@slax:~# ./ex1 sin(45) = 0.706825 root@slax:~# Exemplul 2 - S se creeze un ier Makele pentru compilarea urmtoarei aplicatii a s a cu surse multiple: main.c: #include <stdio.h> double ma(int nr[20], int n); double mg(int nr[20], int n); int main() { double med_a, med_g; int i,n, nr[20]; printf("n= "); scanf("%d",&n); for (i=0;i<n;i++) { printf("nr[%d]= ",i+1); scanf("%d",&nr[i]); } med_a = ma(nr,n); med_g = mg(nr,n); printf("Media aritmetica= %lf\n",med_a); printf("Media geometrica= %lf\n",med_g); return 0; } 65

Bazele Utilizrii Calculatoarelor a

medii.c: #include <math.h> double ma(int nr[20], int n) { int i; double res=0; for (i=0;i<n;i++) { res=res+nr[i]; } return (res/n); }

double mg(int nr[20], int n) { int i; double res=1; for (i=0;i<n;i++) { res=res*nr[i]; } return sqrt(res); } Makele: OBJS= main.o medii.o CC= gcc CFLAGS= -c -Wall LFLAGS = -lm -Wall main.o: main.c $(CC) $(CFLAGS) main.c medii.o: medii.c $(CC) $(CFLAGS) medii.c ex2: $(OBJS) $(CC) $(LFLAGS) $(OBJS) -o ex2 clean: rm -rf *.o ex2

66

Lucrarea nr. 10

compilare: root@slax:~# make ex2 gcc -c -Wall main.c gcc -c -Wall medii.c gcc -lm -Wall main.o medii.o -o ex2 root@slax:~# ./ex2 n= 3 nr[1]= 1 nr[2]= 2 nr[3]= 3 Media aritmetica= 2.000000 Media geometrica= 2.449490 root@slax:~#

10.3.

Exercitii propuse

1) S se scrie un program C care calculeaz rdcinile reale sau complexe ale unei ecuatii a a a a de gradul 2 de forma ax2 + bx + c = 0, unde a, b i c sunt numere s ntregi introduse de la tastatur. S se scrie un ier Makele pentru acest program. a a s 2) S se scrie un program C pentru calculul combinrilor de n luate cte k tiind c: a a a s a n! k Cn = . Functiile factorial i combinari se vor scrie s ntr-un ier denumit s (n k)! k! functii.c iar apelarea lor i citirea valorilor lui n i k se va face ierul main.c. s s n s S se scrie un ier Makele pentru acest program. a s 3) S se scrie un program C pentru calculul determinantului unei matrice 4x4 cu elea mente numere reale introduse de la tastatur. S se scrie un ier Makele pentru a a s acest program.

67