This shows you the differences between two versions of the page.
uso-ac:laboratoare:laborator-03 [2016/10/19 17:55] giorgiana.vlasceanu [[BONUS #2] Investigarea bibliotecilor externe folosite (1 Karma WoUSO)] |
uso-ac:laboratoare:laborator-03 [2016/10/25 23:22] (current) giorgiana.vlasceanu [[5] Detectarea și corectarea erorilor de linkare (1.5p)] |
||
---|---|---|---|
Line 488: | Line 488: | ||
</note> | </note> | ||
- | ===== [1] Compilarea unui fișier sursă C (0.5p) ===== | + | ===== [1] Compilarea unui fișier sursă C (2p) ===== |
Pentru a rezolva următoarea serie de exerciții mergeți în directorul ''/home/student/uso/lab03/simple-gcc''. Pentru aceasta | Pentru a rezolva următoarea serie de exerciții mergeți în directorul ''/home/student/uso/lab03/simple-gcc''. Pentru aceasta | ||
folosim următoarea comandă ''cd ~/uso/lab03/simple-gcc''. În directorul ''simple-gcc'' găsiți fișierul sursă ''simple_hello.c''. Compilați-l, folosind ''gcc'', într-un fișier executabil denumit ''hello''. Pentru aceasta folosim următoarea comandă: | folosim următoarea comandă ''cd ~/uso/lab03/simple-gcc''. În directorul ''simple-gcc'' găsiți fișierul sursă ''simple_hello.c''. Compilați-l, folosind ''gcc'', într-un fișier executabil denumit ''hello''. Pentru aceasta folosim următoarea comandă: | ||
Line 520: | Line 520: | ||
Observăm că cele două fișiere sunt într-adevăr identice, acest lucru datorându-se faptului că procesul de compilare este unul determinist (o bucată de cod sursă C se va //traduce// mereu în exact aceleași instrucțiuni în limbaj de asamblare și apoi în cod mașină - dacă se păstrează același grad de optimizare). | Observăm că cele două fișiere sunt într-adevăr identice, acest lucru datorându-se faptului că procesul de compilare este unul determinist (o bucată de cod sursă C se va //traduce// mereu în exact aceleași instrucțiuni în limbaj de asamblare și apoi în cod mașină - dacă se păstrează același grad de optimizare). | ||
- | ===== [2] Detectarea și corectarea warning-urilor (1p) ===== | + | ===== [2] Detectarea și corectarea warning-urilor (2p) ===== |
În același director ca mai sus, ''/home/student/uso/lab03/simple-gcc'', găsim fișierul ''warnings.c''. Compilați-l folosind următoarea comandă: | În același director ca mai sus, ''/home/student/uso/lab03/simple-gcc'', găsim fișierul ''warnings.c''. Compilați-l folosind următoarea comandă: | ||
Line 564: | Line 564: | ||
</solution> | </solution> | ||
- | ===== [3] Detectarea și corectarea erorilor de compilare (1p) ===== | + | ===== [3] Compilarea temei folosind Makefile (3p) ===== |
+ | |||
+ | Intrați în directorul ''/home/student/uso/lab03/tema-pc''. Dorim să compilăm tema la programare folosind fișierul ''Makefile''. Rulați comanda ''make''. | ||
+ | |||
+ | Rulați încă o dată comanda ''make''. S-a mai executat vreo comandă? | ||
+ | |||
+ | <solution> | ||
+ | <code bash> | ||
+ | student@midgard:~$ make | ||
+ | gcc -Wall -c tema.c | ||
+ | gcc -Wall -c utils.c | ||
+ | gcc -Wall tema.o utils.o -o tema | ||
+ | student@midgard:~$ make | ||
+ | make: Nothing to be done for `all'. | ||
+ | </code> | ||
+ | |||
+ | </solution> | ||
+ | |||
+ | Schimbați valoarea macro-ului ''MIN_VAL'' în fișierul ''utils.h''. Rulați încă o dată comanda ''make''. De ce nu se actualizează fișierul executabil? Modificați fișierul ''Makefile'' pentru ca obținerea fișierelor obiect (cu extensia ''.o'') să țină cont și de fișierele header (cu extensia ''.h'') de care acestea depind. | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | Revedeți [[#makefiles|secțiunea de Makefiles]] din suportul laboratorului. | ||
+ | </note> | ||
+ | |||
+ | <solution> | ||
+ | <code C utils.h> | ||
+ | #define MIN_VAL 8 // in loc de 5 | ||
+ | #define MAX_VAL 3 | ||
+ | |||
+ | int vect_gt(int*, int, int); | ||
+ | int vect_lt(int*, int, int); | ||
+ | </code> | ||
+ | |||
+ | <code bash> | ||
+ | student@midgard:~$ make | ||
+ | make: Nothing to be done for `all'. | ||
+ | student@midgard:~$ ./tema | ||
+ | Values: 10 -20 30 9 7 8 11 5 -2 100 | ||
+ | Values greater than 5: 7 | ||
+ | Values less than 3: 2 | ||
+ | </code> | ||
+ | |||
+ | <code make Makefile> | ||
+ | all: tema | ||
+ | |||
+ | tema: tema.o utils.o | ||
+ | gcc -Wall tema.o utils.o -o tema | ||
+ | |||
+ | tema.o: tema.c utils.h | ||
+ | gcc -Wall -c tema.c | ||
+ | |||
+ | utils.o: utils.c | ||
+ | gcc -Wall -c utils.c | ||
+ | |||
+ | run: tema | ||
+ | ./tema | ||
+ | |||
+ | clean: | ||
+ | rm -f *.o *~ tema | ||
+ | </code> | ||
+ | <code bash> | ||
+ | student@midgard:~$ make | ||
+ | gcc -Wall -c tema.c | ||
+ | gcc -Wall tema.o utils.o -o tema | ||
+ | student@midgard:~$ ./tema | ||
+ | Values: 10 -20 30 9 7 8 11 5 -2 100 | ||
+ | Values greater than 8: 5 | ||
+ | Values less than 3: 2 | ||
+ | </code> | ||
+ | </solution> | ||
+ | |||
+ | ===== [4] Detectarea și corectarea erorilor de compilare (1p) ===== | ||
În același director ca mai sus, ''/home/student/uso/lab03/simple-gcc'', găsim fișierul ''errors.c''. Compilați-l folosind următoarea comandă: | În același director ca mai sus, ''/home/student/uso/lab03/simple-gcc'', găsim fișierul ''errors.c''. Compilați-l folosind următoarea comandă: | ||
<code bash> | <code bash> | ||
Line 595: | Line 667: | ||
</solution> | </solution> | ||
- | ===== [4] Detectarea și corectarea erorilor de linkare (1.5p) ===== | + | ===== [5] Detectarea și corectarea erorilor de linkare (1p) ===== |
Mergeți în directorul ''/home/student/uso/lab03/tema-pc'', unde găsim 4 fișiere. Pentru acest exercițiu ignorați fișierul ''Makefile'', ne interesează numai ''tema.c'', ''utils.c'' și ''utils.h''. | Mergeți în directorul ''/home/student/uso/lab03/tema-pc'', unde găsim 4 fișiere. Pentru acest exercițiu ignorați fișierul ''Makefile'', ne interesează numai ''tema.c'', ''utils.c'' și ''utils.h''. | ||
Line 674: | Line 746: | ||
<note tip>Un mare avantaj al opririi procesului de compilare înainte de **etapa de linkare** este faptul că putem //refolosi// fișiele obiect. Dacă avem un proiect mare cu numeroase fișiere sursă și realizăm o modificare într-un singur fișier sursă, nu este nevoie sa compilăm de fiecare dată toate fișierele, ci numai cel modificat, fiind astfel suficient doar să le relinkăm la final. Cum putem exploata acest lucru vom observa în exercițiile următoare. | <note tip>Un mare avantaj al opririi procesului de compilare înainte de **etapa de linkare** este faptul că putem //refolosi// fișiele obiect. Dacă avem un proiect mare cu numeroase fișiere sursă și realizăm o modificare într-un singur fișier sursă, nu este nevoie sa compilăm de fiecare dată toate fișierele, ci numai cel modificat, fiind astfel suficient doar să le relinkăm la final. Cum putem exploata acest lucru vom observa în exercițiile următoare. | ||
</note> | </note> | ||
- | ===== [5] Compilarea temei folosind Makefile (2p) ===== | ||
- | Intrați în directorul ''/home/student/uso/lab03/tema-pc''. Dorim să compilăm tema la programare folosind fișierul ''Makefile''. Rulați comanda ''make''. | ||
- | |||
- | Rulați încă o dată comanda ''make''. S-a mai executat vreo comandă? | ||
- | |||
- | <solution> | ||
- | <code bash> | ||
- | student@midgard:~$ make | ||
- | gcc -Wall -c tema.c | ||
- | gcc -Wall -c utils.c | ||
- | gcc -Wall tema.o utils.o -o tema | ||
- | student@midgard:~$ make | ||
- | make: Nothing to be done for `all'. | ||
- | </code> | ||
- | |||
- | </solution> | ||
- | |||
- | Schimbați valoarea macro-ului ''MIN_VAL'' în fișierul ''utils.h''. Rulați încă o dată comanda ''make''. De ce nu se actualizează fișierul executabil? Modificați fișierul ''Makefile'' pentru ca obținerea fișierelor obiect (cu extensia ''.o'') să țină cont și de fișierele header (cu extensia ''.h'') de care acestea depind. | ||
- | |||
- | |||
- | <note tip> | ||
- | Revedeți [[#makefiles|secțiunea de Makefiles]] din suportul laboratorului. | ||
- | </note> | ||
- | |||
- | <solution> | ||
- | <code C utils.h> | ||
- | #define MIN_VAL 8 // in loc de 5 | ||
- | #define MAX_VAL 3 | ||
- | |||
- | int vect_gt(int*, int, int); | ||
- | int vect_lt(int*, int, int); | ||
- | </code> | ||
- | |||
- | <code bash> | ||
- | student@midgard:~$ make | ||
- | make: Nothing to be done for `all'. | ||
- | student@midgard:~$ ./tema | ||
- | Values: 10 -20 30 9 7 8 11 5 -2 100 | ||
- | Values greater than 5: 7 | ||
- | Values less than 3: 2 | ||
- | </code> | ||
- | |||
- | <code make Makefile> | ||
- | all: tema | ||
- | |||
- | tema: tema.o utils.o | ||
- | gcc -Wall tema.o utils.o -o tema | ||
- | |||
- | tema.o: tema.c utils.h | ||
- | gcc -Wall -c tema.c | ||
- | |||
- | utils.o: utils.c | ||
- | gcc -Wall -c utils.c | ||
- | |||
- | run: tema | ||
- | ./tema | ||
- | |||
- | clean: | ||
- | rm -f *.o *~ tema | ||
- | </code> | ||
- | <code bash> | ||
- | student@midgard:~$ make | ||
- | gcc -Wall -c tema.c | ||
- | gcc -Wall tema.o utils.o -o tema | ||
- | student@midgard:~$ ./tema | ||
- | Values: 10 -20 30 9 7 8 11 5 -2 100 | ||
- | Values greater than 8: 5 | ||
- | Values less than 3: 2 | ||
- | </code> | ||
- | </solution> | ||
Line 896: | Line 898: | ||
</note> | </note> | ||
- | ===== [Bonus #3] Instalarea și compilarea din surse (2 Karma WoUSO) ===== | + | ===== [Bonus #5] Instalarea și compilarea din surse (2 Karma WoUSO) ===== |
Vrem să compilăm și să instalăm un program din cod sursă (adică nu dintr-un pachet). | Vrem să compilăm și să instalăm un program din cod sursă (adică nu dintr-un pachet). | ||
Line 917: | Line 919: | ||
</note> | </note> | ||
- | ===== [Bonus #4] Good code practices (1-5 Karma WoUSO) ===== | + | ===== [Bonus #6] Good code practices (1-5 Karma WoUSO) ===== |
<hidden> | <hidden> | ||
Punctați de la 1 la 5 în funcție de cât de multe probleme au rezolvat. Câteva exemple ar fi: | Punctați de la 1 la 5 în funcție de cât de multe probleme au rezolvat. Câteva exemple ar fi: |