Unelte utilizator

Unelte site


laboratoare:laborator-01

Diferențe

Aici sunt prezentate diferențele dintre versiunile selectate și versiunea curentă a paginii.

Link către această vizualizare comparativă

Ambele părți revizuirea anterioară Versiuni anterioare
Urmatoarea versiune
Versiuni anterioare
Ultima versiune Ambele părți următoarea reviziune
laboratoare:laborator-01 [2017/02/18 21:07]
iulian.matesica [2.3.2. Fișiere header și include guards]
laboratoare:laborator-01 [2018/02/21 16:31]
mihai.iacov [1. Obiectivele laboratorului pe întreg semestrul]
Linia 1: Linia 1:
 ====== Laborator 01: Introducere ====== ====== Laborator 01: Introducere ======
  
-===== 1. Obiectivele laboratorului =====+===== 1. Reguli pentru laborator=====
  
-* familiarizarea cu structuri de date +Mai multe detalii pot fi găsite pe pagina [[informaii-generale:notare|Reguli de notare]].
-    * liste +
-    * stive +
-    * cozi+
  
- +==== Reguli esenţiale pentru promovarea laboratorului==== 
-* introducere in algoritmi și tehnici de programare +---- 
-    recursivitate  +* **MAXIM** 3 absenţe la laborator (**NU** se poate reface la alte grupe) 
-    divide et impera +**MINIM** jumătate din punctajul de laborator
-    greedy +
-    programare dinamică +
-    backtracking +
- +
- +
-introducere în teoria grafurilor +
-    parcurgeri de grafuri/arbori +
-    arbori binari, arbori minimi de acoperire +
-    * drumuri minime in graf (Dijkstra)+
  
  
Linia 38: Linia 26:
 Pe stațiile de lucru din laborator a fost instalat VMware Player și adăugată mașina virtuală cu numele SDA-AB. Porniți mașina virtuală. Pe stațiile de lucru din laborator a fost instalat VMware Player și adăugată mașina virtuală cu numele SDA-AB. Porniți mașina virtuală.
  
-{{ :laboratoare:vmware_player.png?nolink |}}+{{ :laboratoare:vmware_player.png?nolink&786 |}}
  
 Credențialele sunt următoarele: Credențialele sunt următoarele:
Linia 178: Linia 166:
 === 2.3.2. GNU Make === === 2.3.2. GNU Make ===
 **Make** este un utilitar din GNU Toolchain care permite automatizarea și eficientizarea sarcinilor. În mod particular este folosit pentru automatizarea compilării programelor. În cazul în care avem un proiect care are un număr foarte mare de fișiere sursă, compilarea întregului proiect de la zero poate dura foarte mult. Prin folosirea utilitarului **make** putem automatiza compilarea fiecărui fișier separat ''%%.c%%'' într-un fișier obiect (binar) ''%%.o%%'', apoi unirea tuturor fișierelor obiect într-un singur fișier executabil. La o modificare se va recompila doar fișierul sursă modificat, rezultând un nou fișier obiect ''%%.o%%''. Astfel, procesul de compilare este mult mai rapid. **Make** este un utilitar din GNU Toolchain care permite automatizarea și eficientizarea sarcinilor. În mod particular este folosit pentru automatizarea compilării programelor. În cazul în care avem un proiect care are un număr foarte mare de fișiere sursă, compilarea întregului proiect de la zero poate dura foarte mult. Prin folosirea utilitarului **make** putem automatiza compilarea fiecărui fișier separat ''%%.c%%'' într-un fișier obiect (binar) ''%%.o%%'', apoi unirea tuturor fișierelor obiect într-un singur fișier executabil. La o modificare se va recompila doar fișierul sursă modificat, rezultând un nou fișier obiect ''%%.o%%''. Astfel, procesul de compilare este mult mai rapid.
 +
 +Utilitarul **make** folosește un fișier de configurare denumit ''%%Makefile%%''. Un astfel de fișier conține reguli și comenzi de automatizare.
 +
 +=== Exemplu de utilizare ===
 +<file Makefile Makefile>
 +all:
 +    gcc hello.c -o hello
 +clean:
 +    rm -f hello
 +</file>
 +
 +<code bash>
 +student@sda-ab-vm:~/Documents$ ls
 +hello.c  Makefile
 +student@sda-ab-vm:~/Documents$ make
 +gcc hello.c -o hello
 +student@sda-ab-vm:~/Documents$ ls
 +hello  hello.c  Makefile
 +student@sda-ab-vm:~/Documents$ make clean
 +rm -f hello
 +student@sda-ab-vm:~/Documents$ ls
 +hello.c  Makefile
 +student@sda-ab-vm:~/Documents$ make all
 +gcc hello.c -o hello
 +student@sda-ab-vm:~/Documents$ ls
 +hello  hello.c  Makefile
 +</code>
 +
 +Exemplul prezentat mai sus conține două reguli: ''%%all%%'' și ''%%clean%%''. La rularea comenzii make se execută prima regulă din Makefile (în cazul de față all, nu contează în mod special denumirea). Comanda executată este ''%%gcc hello.c -o hello%%''. Se poate preciza explicit ce regulă să se execute prin transmiterea ca argument comenzii ''%%make%%''. (comanda ''%%make clean%%'' pentru a șterge executabilul ''%%hello%%'' și comanda ''%%make all%%'' pentru a obține din nou acel executabil). 
 +
 +
 +=== Sintaxa unei reguli ===
 +Sintaxa unei reguli dintr-un fișier Makefile:
 +
 +{{ :laboratoare:makefile.png?nolink |}}
 +
 +
 + * **target** - este, de obicei, fișierul care se va obține prin rularea comenzii command. După cum s-a observat și din exemplul anterior, poate să fie o țintă virtuală care nu are asociat un fișier. 
 + * **prerequisites** - reprezintă dependențele necesare pentru a urmări regula; de obicei sunt fișiere necesare pentru obținerea țintei.
 + * **<tab>** - reprezintă caracterul tab și trebuie neaparat folosit înaintea precizării comenzii.
 + * **command** - o listă de comenzi (niciuna, una, oricâte) rulate în momentul în care se trece la obținerea țintei.
 +
 +
 +Un exemplu recomandat pentru un fișier ''%%Makefile%%'' este:
 +<file Makefile Makefile>
 +all: hello
 + 
 +hello: hello.o
 +        gcc hello.o -o hello
 + 
 +hello.o: hello.c
 +        gcc -c hello.c
 + 
 +clean:
 +        rm -f *.o *~ hello
 +</file>
 +
 +Observăm prezeța regulii ''%%all%%'' care va fi executată implicit.
 +
 + * **all** are ca dependență ''%%hello%%'' și nu execută nicio comandă
 + * **hello** are ca dependență ''%%hello.o%%'' și realizează link-editarea fișierului ''%%hello.o%%''
 + * **hello.o** are ca dependență ''%%hello.c%%'' și realizează compilarea fișierului ''%%hello.c%%'' în fișierul obiect ''%%hello.o%%''.
 +
 +<note>La regula cu target-ul ''%%hello.o%%'' se observă folosirea opțiunii ''%%-c%%'' a utilitarului ''%%gcc%%''. Aceasta opțiune se folosește pentru a obține doar fișierul obiect din codul sursă. Se oprește procesul de compilare inainte de obținerea executabilului. La final se continua compilarea cu unirea tuturor fișierelor obiect ''%%.o%%'' într-un fișier executabil. </note>
 +
 +=== Folosirea variabilelor ===
 +Un fișier ''%%Makefile%%'' permite folosirea de variabile. Astfel, un exemplu uzual de fișier ''%%Makefile%%'' este:
 +
 +<file Makefile Makefile>
 +CC = gcc
 +CFLAGS = -Wall -g
 + 
 +all: hello
 + 
 +hello: hello.o
 +        $(CC) $^ -o $@
 + 
 +hello.o: hello.c
 +        $(CC) $(CFLAGS) -c $<
 +        
 +clean:
 +        rm -f *.o *~ hello
 +</file>
 +
 +În exemplul de mai sus au fost definite variabilele ''%%CC%%'' și ''%%CFLAGS%%''. Variabia ''%%CC%%'' reprezintă compilatorul folosit, iar variabila ''%%CFLAGS%%'' reprezintă opțiunile de compilare utilizate; în cazul de față sunt afișarea tuturor warning-urilor (**-Wall**) cu suport de depanare (**-g**).
 +
 +Variabilele predefinte sunt:
 + * **$@** se expandează la numele target-ului
 + * **$^** se expandează la lista de cerințe (prerequisites - lista de dependențe)
 + * **$<** se expandează la prima cerință (la prima dependență)
 +
 +
 +===== 4. GDB =====
 +
 +GDB (GNU Debugger) este unealta standard pentru debugging (depanare) din GNU. Este portabil şi poate fi folosit, printre altele, pentru a detecta instrucţiunea ce determina blocarea unui program la rulare (precum şi semnalul asociat erorii).
 +
 +Exemplu de lansare:\\
 +<code>
 +gcc -Wall -g my_file.c -o my_file.exe
 +gdb my_file.exe
 +</code>
 +
 +**Câteva comenzi utile în timpul depanării:**\\
 +• **list** - arată conţinutul unui fişier (câteva rânduri, în jurul unui punct numit) \\
 +• **run** - porneşte executia\\
 +• **n** (sau **next**) - trece la instrucţiunea următoare (fără a intra în apeluri de funcţii)\\
 +• **s** (sau **step**) - intră în apel de funcţie pentru a inspecta execuţia\\
 +• **b** (sau **break** sau **breakpoint**) - setează un breakpoint ce va forţa oprirea execuţiei în punctul respectiv\\
 +• **continue** - continuă execuţia până la următorul breakpoint\\
 +• **fin** (sau **finish**) - iese din funcţia curentă\\
 +
 +<note important>**list** şi **breakpoint** au nevoie de un parametru care să indice o instrucţiune ("punctul" dorit).</note>
 +
 +Exemple de identificare a instrucţiunilor (la fel pentru list) - funcţie, rândul din fişier, adresa din memorie (eventual cu explicitarea fişierului):\\
 +<code>
 +breakpoint my_function
 +breakpoint 13
 +breakpoint *0x401377
 +
 +breakpoint my_file:10
 +breakpoint my_file:my_function
 +</code>
 +
  
 ---- ----
-===== 3Ceva chestii cu surse si headere =====+===== 5Exerciții ===== 
 + 
 +==== Exercițiul 1 - Hello world  ==== 
 +Realizați un program un C/C++ care afișează mesajul //Hello, World// la ieșirea standard. 
 + 
 +==== Exercițiul 2 - Makefile  ==== 
 +Realizați un fișier Makefile pentru programul de la exercițiul 1 astfel încat: 
 + 
 + * la rularea comenzii ''%%make build%%'' să se obțină executabilul ''%%hello%%'' 
 + * la rularea comenzii ''%%make clean%%'' să se șteargă fișierul ''%%hello%%'' de pe disc. 
 + 
 + 
 +==== Exercițiul 3 - Makefile cu surse multiple  ==== 
 + 
  
 ---- ----
-===== 4Exerciții =====+===== 6Referinț===== 
 +  - [[https://ocw.cs.pub.ro/courses/so/laboratoare/laborator-01|More about GCC, Linux, Makefiles]]
  
-==== Exercițiul 1 - Hello world (2p) ==== 
-==== Exercițiul 2 - Makefile (3p) ==== 
-==== Exercițiul 3 - Makefile cu surse multiple (3p) ==== 
-==== Exercițiul 4 - ?? ==== 
  
laboratoare/laborator-01.txt · Ultima modificare: 2018/02/21 16:32 de către mihai.iacov