Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:laboratoare:lab11 [2025/12/14 02:13]
darius.neatu
programare:laboratoare:lab11 [2025/12/30 15:53] (current)
cosmin_stefan.popa [Noţiuni teoretice]
Line 1: Line 1:
 ===== PCLP Laborator11:​ Parametrii liniei de comandă. Preprocesorul. Funcții cu număr variabil de parametri. Opțiuni de compilare ​ ===== ===== PCLP Laborator11:​ Parametrii liniei de comandă. Preprocesorul. Funcții cu număr variabil de parametri. Opțiuni de compilare ​ =====
 +
 +**Resposabili:​**
 +  * [[ion_dorinel.filip@cti.pub.ro|Dorinel Filip (2016 - Prezent)]]
 +  * [[neatudarius@gmail.com|Darius Neațu (2016 - Prezent)]]
 +  * [[mihaela.vasile@gmail.com|Mihaela Vasile (2015)]]
  
 ==== Obiective ====  ==== Obiective ==== 
Line 22: Line 27:
 Pentru a controla execuţia unui program, de multe ori este de dorit furnizarea datelor de lucru înaintea lansării în execuţie a programului,​ acesta urmând să se execute apoi fără intervenţia utilizatorului (aşa-numitul „batch mode”). Acest lucru se realizează prin intermediul parametrilor liniei de comandă. (Un exemplu cunoscut este lansarea compilatorului gcc în linia de comandă cu diverse argumente, care îi spun ce şi cum sa compileze.) Pentru a controla execuţia unui program, de multe ori este de dorit furnizarea datelor de lucru înaintea lansării în execuţie a programului,​ acesta urmând să se execute apoi fără intervenţia utilizatorului (aşa-numitul „batch mode”). Acest lucru se realizează prin intermediul parametrilor liniei de comandă. (Un exemplu cunoscut este lansarea compilatorului gcc în linia de comandă cu diverse argumente, care îi spun ce şi cum sa compileze.)
  
-Din punct de vedere al utilizatorului,​ parametrii liniei de comandă sunt simple argumente care se adaugă după numele unui program, în linia de comandă, la rularea sa. Elementele acestei liste de argumente sunt şiruri de caractere separate de spaţii. Argumentele care conţin spaţii pot fi combinate într-un singur argument prin inchiderea acestuia între ghilimele. Shell-ul este cel care se ocupă de parsarea liniei de comandă şi de crearea listei de argumente.+Din punctul ​de vedere al utilizatorului,​ parametrii liniei de comandă sunt simple argumente care se adaugă după numele unui program, în linia de comandă, la rularea sa. Elementele acestei liste de argumente sunt şiruri de caractere separate de spaţii. Argumentele care conţin spaţii pot fi combinate într-un singur argument prin inchiderea acestuia între ghilimele. Shell-ul este cel care se ocupă de parsarea liniei de comandă şi de crearea listei de argumente.
  
 Exemplu de apelare a unui program cu argumente în linia de comandă: Exemplu de apelare a unui program cu argumente în linia de comandă:
Line 38: Line 43:
   * myshell.c   * myshell.c
  
-Din punct de vedere al programatorului,​ parametrii liniei de comandă sunt accesibili prin utilizarea parametrilor funcţiei main(). Astfel, când se doreşte folosirea argumentelor liniei de comandă, funcţia main() se va defini astfel:+Din punctul ​de vedere al programatorului,​ parametrii liniei de comandă sunt accesibili prin utilizarea parametrilor funcţiei main(). Astfel, când se doreşte folosirea argumentelor liniei de comandă, funcţia main() se va defini astfel:
 <code c> <code c>
 int main(int argc, char *argv[]) int main(int argc, char *argv[])
Line 1041: Line 1046:
 === Opțiuni de compilare === === Opțiuni de compilare ===
  
-https://​ocw.cs.pub.ro/​courses/​programare/​laboratoare/​lab01#utilizare_gcc+== Compilatorul GCC == 
 + 
 +În cadrul laboratorului și pentru testarea temelor de casă se va folosi compilatorul GCC. GCC este unul dintre primele pachete software dezvoltate în cadrul Proiectului GNU (''​GNU'​s Not Unix''​) de către Free Software Foundation. Deși GCC se traducea iniţial prin ''​GNU C Compiler'',​ acesta a devenit între timp un compilator multifrontend,​ multi-backend,​ având suport pentru o serie largă de limbaje, ca C, C++, Objective-C,​ Ada, Java, etc, astfel că denumirea curentă a devenit ''​GNU Compiler Collection''​. În cadrul cursului de [[http://​ocw.cs.pub.ro/​programare|Programare]] ne vom referi totuşi numai la partea de C din suita de compilatoare. 
 + 
 +Compilatorul GCC rulează pe o gamă largă de echipamente hardware (procesoare din familia: ''​i386,​ alpha, vax, m68k, sparc, HPPA, arm, MIPS, PowerPC,''​ etc.) și de sisteme de operare (''​GNU/​Linux,​ DOS, Windows 9x/NT/2000, Solaris, Tru64, VMS, Ultrix, Aix ''​),​ fiind la ora actuală cel mai folosit compilator. 
 + 
 +Compilatorul GCC se apelează din linia de comandă, folosind diferite opțiuni, în funcție de rezultatul care se dorește (specificarea de căi suplimentare de căutare a bibliotecilor/​fișierelor antet, link-area unor biblioteci specifice, opțiuni de optimizare, controlul stagiilor de compilare, al avertisementelor,​ etc.).  
 + 
 +== Utilizare GCC == 
 + 
 +<​hidden>​ 
 +<​note>​ 
 +Instrucțiuni de instalare gcc - [[https://​ocw.cs.pub.ro/​courses/​programare/​vmchecker_conf#​instalare_gccmake| Instalare gcc/make ]] 
 +</​note>​ 
 +</​hidden>​ 
 + 
 +Vom folosi pentru exemplificare un program simplu care tipărește la ieșirea standard un șir de caractere. 
 + 
 +<code c hello.c>​ 
 +#include <​stdio.h>​ 
 + 
 +int main() { 
 +  printf("​Hello from your first program!\n"​);​ 
 +  return 0; 
 +
 +</​code>​ 
 + 
 +Pentru compilarea programului se va lansa comanda (în linia de comandă):​ 
 +<code bash> gcc hello.c</​code>​ 
 +presupunând că fișierul sursă se numește ''​hello.c''​. 
 + 
 +Pe un sistem de operare ''​Linux'',​ compilarea default va genera un executabil cu numele ''​a.out''​. Pentru rularea acestuia, trebuie executată comanda: 
 +<code bash> ./​a.out</​code>​ 
 + 
 +Pentru un control mai fin al comportării compilatorului,​ sunt prezentate în tabelul următor cele mai folosite opţiuni (pentru lista completă studiaţi pagina de manual pentru GCC - ''​man gcc''​):​ 
 + 
 +^ Opțiune ^ Efect ^ 
 +|**-o** nume_fișier|Numele fișierului de ieşire va fi nume_fişier. În cazul în care această opțiune nu este setată, se va folosi numele implicit (pentru fișiere executabile:​ a.out - pentru Linux).| 
 +|**-I** cale_către_fișiere_antet|Caută fișiere antet și în calea specificată.| 
 +|**-L** cale_către_biblioteci|Caută fișiere bibliotecă și în calea specificată.| 
 +|**-l** nume_bibliotecă|Link-editează biblioteca ''​nume_bibliotecă''​. **Atenție!!!** ''​nume_bibliotecă''​ nu este întotdeauna același cu numele fișierului antet prin care se include această bibliotecă. Spre exemplu, pentru includerea bibliotecii de funcții matematice, fișierul antet este math.h, iar biblioteca este ''​m''​.| 
 +|**-W** tip_warning|Afișează tipurile de avertismente specificate (Pentru mai multe detalii ''​man gcc''​ sau ''​gcc --help''​). Cel mai folosit tip este ''​all''​. Este indicat ca la compilarea cu ''​-Wall''​ să nu apară nici un fel de avertismente.| 
 +|**-c**|Compilează și asamblează,​ dar nu link-editează. Generează fișiere obiect, cu extensia ''​.o''​.| 
 +|**-S**|Se oprește după faza de compilare, fară să asambleze. Rezultă cod assembler în fișiere cu extensia ''​.s''​.| 
 + 
 +<​hidden>​ 
 +Despre etapele compilării puteți să citiți mai multe [[http://​elf.cs.pub.ro/​so/​wiki/​laboratoare/​laborator-01#fazele-compilarii|aici]]. 
 +</​hidden>​ 
 + 
 += Exemplu = 
 + 
 +<code bash>gcc -o tema1 tema1.c -lm -Wall</​code>​ 
 + 
 +Comanda de mai sus are ca efect compilarea și link-editarea fişierului ''​tema1.c'',​ cu includerea bibliotecii matematice, afişând toate avertismentele. Fişierul de ieşire se va numi ''​tema1''​. 
 + 
 +**Atenție!!!** Dacă folosiți opțiunea **-o**, nu adăugați imediat după fișierele sursă. Acest lucru ar avea ca efect suprascrierea acestora și pierderea întregului conținut. 
 + 
 +== Utilitarul Make == 
 + 
 +<​note>​ 
 +Instrucțiuni de instalare gcc - [[https://​ocw.cs.pub.ro/​courses/​programare/​vmchecker_conf#​instalare_gccmake| Instalare gcc/make ]] 
 +</​note>​ 
 + 
 +Utilitarul ''​make''​ determină automat care sunt părțile unui proiect care trebuie recompilate ca urmare a operării unor modificări și declanşează comenzile necesare pentru recompilarea lor. Pentru a putea utiliza ''​make'',​ este necesar un fișier de tip ''​makefile''​ (numit de obicei ''​Makefile''​ sau ''​makefile''​) care descrie relațiile de dependenţă între diferitele fișiere din care se compune programul şi care specifică regulile de actualizare pentru fiecare fişier în parte. 
 + 
 +În mod normal, într-un program, fişierul executabil este actualizat (recompilat) pe baza fișierelor-obiect,​ care la rândul lor sunt obținute prin compilarea fișierelor sursă. Totuși, acest utilitar poate fi folosit pentru orice proiect care conţine dependenţe şi cu orice compilator/​utilitar care poate rula în linia de comandă. Odată creat fișierul ''​makefile'',​ de fiecare dată când apare vreo modificare în fișierele sursă, este suficient să rulăm utilitarul ''​make''​ pentru ca toate recompilările necesare să fie efectuate. Programul ''​make''​ utilizează fișierul Makefile ca bază de date şi pe baza timpilor ultimei modificări a fișierelor din Makefile decide care sunt fișierele care trebuie actualizate. Pentru fiecare din aceste fișiere, sunt executate comenzile precizate in Makefile. În continuare prezentăm un exemplu simplu. 
 + 
 +<code bash> 
 +# Declaratiile de variabile 
 +CC = gcc 
 +CFLAGS = -Wall -lm 
 +SRC = radical.c 
 +EXE = radical 
 + 
 +# Regula de compilare 
 +all: 
 + $(CC) -o $(EXE) $(SRC) $(CFLAGS) 
 + 
 +# Regulile de "​curatenie"​ (se folosesc pentru stergerea fisierelor intermediare si/sau rezultate) 
 +.PHONY : clean 
 +clean : 
 + rm -f $(EXE) *~ 
 +</​code>​ 
 + 
 +**Atenție!!!** Este obligatorie folosirea tab-urilor (nu spații!). 
 +Mai multe informații puteți găsiti pe [[http://​www.gnu.org/​software/​make|pagina proiectului]]. 
  
 ==== Exerciții ==== ==== Exerciții ====
Line 1048: Line 1139:
  
 ==== Referinţe ==== ==== Referinţe ====
-  * TODO+  * https://​en.cppreference.com/​w/​c/​variadic.html 
 +  * https://​en.cppreference.com/​w/​c/​preprocessor.html
programare/laboratoare/lab11.1765671212.txt.gz · Last modified: 2025/12/14 02:13 by darius.neatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0