Differences

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

Link to this comparison view

so:laboratoare:laborator-01 [2019/02/20 18:29]
ioana_elena.ciornei [Exercițiul 4 - Fișiere make (4p)]
so:laboratoare:laborator-01 [2022/03/09 15:31] (current)
teodor_stefan.dutu [Nmake]
Line 12: Line 12:
 ===== Materiale ajutătoare ===== ===== Materiale ajutătoare =====
  
-  * [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/lab01-slides.pdf ​lab01-slides.pdf]] +  * [[so:​laboratoare:​resurse:​windows-laborator:​tutorial-visual-studio ​Tutorial Visual Studio]]. 
-  * [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/lab01-refcard.pdf | lab01-refcard.pdf]] +  * [[so:​laboratoare:​resurse:​windows-laborator:windows-cli Folosirea CLI în Windows]]
-  * [[http://​elf.cs.pub.ro/​so/​res/​tutorial/​asist-visual-studio/​|Visual Studio Tutorials]]+
   * [[http://​elf.cs.pub.ro/​so/​res/​tutorial/​lab-01-introducere/​|Video Introducere]]   * [[http://​elf.cs.pub.ro/​so/​res/​tutorial/​lab-01-introducere/​|Video Introducere]]
 ==== Nice to read ==== ==== Nice to read ====
Line 635: Line 634:
 === Crearea unei biblioteci partajate === === Crearea unei biblioteci partajate ===
  
-Spre deosebire de o bibliotecă statică despre care am văzut că nu este nimic altceva decât o arhivă de fișiere obiect, o bibliotecă partajată este ea însăși un fișier obiect. Crearea unei biblioteci partajate se realizează prin intermediul linker-ului. Optiunea **''​-shared''​** indică compilatorului să creeze un obiect partajat și nu un fișier executabil. Este, de asemenea, indicată folosirea opțiunii **''​-fPIC''​** la crearea fișierelor obiect.+Spre deosebire de o bibliotecă statică despre care am văzut că nu este nimic altceva decât o arhivă de fișiere obiect, o bibliotecă partajată este ea însăși un fișier obiect. Crearea unei biblioteci partajate se realizează prin intermediul linker-ului. Optiunea **''​-shared''​** indică compilatorului să creeze un obiect partajat și nu un fișier executabil. Este, de asemenea, indicată folosirea opțiunii **''​-fPIC''​** la crearea fișierelor obiect ​(pentru detalii vezi [[https://​gcc.gnu.org/​onlinedocs/​gcc/​Code-Gen-Options.html|GCC Code Gen Options]]).
  
 <code bash> <code bash>
Line 956: Line 955:
 ==== Compilatorul Microsoft cl.exe ==== ==== Compilatorul Microsoft cl.exe ====
  
-Soluția folosită pentru platforma Windows în cadrul acestui laborator este ''​cl.exe'',​ compilatorul Microsoft pentru C/C++. Recomandăm instalarea Microsoft Visual C++ Express 2010 (10.0) (versiunea Professional a Visual C++ este disponibilă gratuit în cadrul MSDNAA). Programele C/C++ pot fi compilate prin intermediul interfeței grafice sau în linie de comandă. În cele ce urmează vom prezenta compilarea folosind linia de comandă. În Windows fișierele cod obiect au extensia ''​*.obj''​. ​+Soluția folosită pentru platforma Windows în cadrul acestui laborator este ''​cl.exe'',​ compilatorul Microsoft pentru C/C++. Recomandăm instalarea Microsoft Visual C++ Express 2010 (10.0) (versiunea Professional a Visual C++ este disponibilă gratuit în cadrul ​[[https://​msdnaa.upb.ro/​|MSDNAA]]). Programele C/C++ pot fi compilate prin intermediul interfeței grafice sau în linie de comandă. În cele ce urmează vom prezenta compilarea folosind linia de comandă. În Windows fișierele cod obiect au extensia ''​*.obj''​. ​
  
 <columns 100% 50% -> <columns 100% 50% ->
Line 1195: Line 1194:
 OBJ_LIST = parser.tab.obj parser.yy.obj OBJ_LIST = parser.tab.obj parser.yy.obj
 CFLAGS ​  = /nologo /W4 /EHsc /Za CFLAGS ​  = /nologo /W4 /EHsc /Za
 +L = link
  
 EXE_NAMES = CUseParser.exe UseParser.exe DisplayStructure.exe EXE_NAMES = CUseParser.exe UseParser.exe DisplayStructure.exe
Line 1201: Line 1201:
  
 CUseParser.exe : CUseParser.obj $(OBJ_LIST) CUseParser.exe : CUseParser.obj $(OBJ_LIST)
-  $(CPP) $(CFLAGS) /Fe$@ $**+  $(L) /Fe$@ $**
  
 UseParser.exe : UseParser.obj $(OBJ_LIST) UseParser.exe : UseParser.obj $(OBJ_LIST)
-  $(CPP) $(CFLAGS) /Fe$@ $**+  $(L) /Fe$@ $**
  
 DisplayStructure.exe : DisplayStructure.obj $(OBJ_LIST) DisplayStructure.exe : DisplayStructure.obj $(OBJ_LIST)
-  $(CPP) $(CFLAGS) /Fe$@ $**+  $(L) /Fe$@ $**
  
 clean : exe_clean obj_clean clean : exe_clean obj_clean
Line 1230: Line 1230:
 ===== Exerciții ===== ===== Exerciții =====
  
-==== Exercițiul 1 Joc interactiv ====+<note important>​ 
 +În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://​github.com/​systems-cs-pub-ro/​so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''​git clone https://​github.com/​systems-cs-pub-ro/​so''​. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''​git clone https://​github.com/​systems-cs-pub-ro/so ${target}''​.
  
-  +Pentru a actualiza repository-ul,​ folosiți comanda ''​git pull origin master''​ din interiorul directorului în care se află repository-ulRecomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentăÎn cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările:​ 
-    * Detalii desfășurare [[http://​ocw.cs.pub.ro/courses/​so/​meta/​notare#​joc_interactiv|joc]].+<​code>​ 
 +git stash 
 +git pull origin master 
 +git stash pop 
 +</code>
  
-<note important>​ +Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul ​de la https://gitimmersion.com. 
-În rezolvarea laboratorului folosiți arhiva ​de sarcini [[http://elf.cs.pub.ro/so/res/laboratoare/lab01-tasks.zip | lab01-tasks.zip]]+ 
 +Pentru mai multe informații despre folosirea utilitarului git pe mașina virtuală de Windows pentru laborator prin intermediul utilitarului CygWin, citiți secțiunea de [[:so:laboratoare::​resurse::​windows-laborator::​windows-cli#​git_in_cygwin | aici]].
 </​note>​ </​note>​
 +
 +==== Exercițiul 0 - Stagii pe bune ====
 +[[https://​stagiipebune.ro/​students/​jobs/​|Stagii pe bune]] este o platformă de internshipuri care vrea să ușureze și să uniformizeze procesul prin care puteți aplica la companii din România (București,​ Iași, Cluj și Timișoara). Facultatea de Automatică și Calculatoare are un parteneriat cu Stagii pe bune și vă încurajăm să le folosiți platforma pentru a aplica la internshipuri! ​
 +
 +Stagii pe bune organizează și evenimente de prezentare a celor mai mari companii din România. Pentru a fi la curent cu acestea, urmăriți și anunțurile postate de Stagii pe bune pe [[https://​www.facebook.com/​stagiipebune|Facebook]].
 +
 ===== Windows ===== ===== Windows =====
-<note important>​ 
-Pentru a parcurge laboratorul mai ușor, recomandăm deschiderea unui browser în interiorul mașinii virtuale de Windows. 
-Descărcați [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab01-tasks.zip | arhiva de laborator]] și în cadrul mașinii virtuale. 
-</​note>​ 
  
-==== Exercițiul ​- Utilizare Visual Studio ​(3p) ====+==== Exercițiul ​- Utilizare Visual Studio ====
  
-  * Punctaj total exercițiu: **3 puncte**+<​note>​ Acest exercițiu ​este de tip tutorial. Citiți cu atenție enunțul și nu săriți pași. </​note>​
  
-=== 2aCompilare și rulare ​===+=== 1aCreare proiect ​===
  
-   * Punctaj: **1 punct**+Deschideți aplicația Microsoft Visual C++ 2010 Express (se află pe desktop-ul mașinii virtuale).
  
-Pentru ​acest pas vom folosi proiectul aflat în directorul ''​win/​VS Tutorial''​. +Pentru ​a crea un proiect nou, apăsați File->New->​Project. ​Se va deschide o fereastră precum cea de mai jos.
-Deschideți proiectul folosind una dintre următoarele trei metode: +
-   * click dreapta pe fișierul ''​*.sln''​ -> //Open with// -> //Microsoft Visual C++ 2010 Express//;​ +
-   * deschideți Visual Studio și apoi //File// -> //​Open// ​-> //Project/Solution// și selectați fișierul ''​*.sln''​ corespunzător; +
-   * dublu click pe fișierul ''​*.sln''​.+
  
-Dacă //Solution Explorer View// nu este vizibil (în stânga), îl putecți activa selectând //​View// ​-> //Solution Explorer// (sau **Ctrl+Alt+L**).+{{:​so:​laboratoare:​lab01-win-newproject.png?400|}}
  
-Pentru a compila proiectul ​selectați ​//Build// -> //Build Solution// sau apăsați tasta **F7**. +În fereastra nou deschisă, ​selectați ​Win32 Console Application (în partea de sus a imaginii, în chenar roșu) și completați informațiile referitoare la numele proiectului (ProiectSO)precum și la locația în care se va afla proiectul (alegeți locația implicită).
-În fereastra //Output// se poate observa output-ul procesului de compilare. În acest cazcompilarea ​se va efectua cu succes.+
  
-Pentru a rula proiectul selectați //Debug// -> //Start Without Debugging// sau tastați **Ctrl+F5**.+Apăsați OK. Apăsați butonul Next pentru a intra în meniul de configurații al aplicației. Se va deschide o fereastră nouă, similară celei de mai jos.
  
-Similar cu mediul Linux, executabilele pot fi rulate și din linia de comandă. +{{:​so:​laboratoare:lab01-win-newproject2.png?400|}}
-''​PowerShell''​ se poate deschide astfel: +
-   * selectând //​Tools// ​-> //​PowerShell Command Prompt// din Visual Studio; +
-   * folosind link-ul //Windows PowerShell//​ aflat pe Desktop.+
  
-În consolă, navigați până când ajungeți în folderul ​''​win/VS Tutorial/​Debug''​. +În fereastra de configurări ale aplicațieiasigurați-vă că alegeți “Console application” ca tip de aplicație (Application type) și ''​Empty project'' ​ca setări adiționale ale proiectului (Additional options) deoarece dorim ca să adăugăm sursele noastre propriiPentru a finaliza crearea proiectului,​ apăsați butonul ​''​Finish''​.
-Rulați comanda: ​''​.\Hello World.exe''​. Se poate folosi tasta TAB pentru autocomplete,​ ca în Linux.+
  
-=== 2b. Creare ​proiect nou ===+În acest moment, am creat un proiect nou, dar care nu are fișiere sursă sau headere. Fișierele corespunzătoare soluției, respectiv proiectului,​ se găsesc în locația specificată la creare. În cazul exemplului de mai sus, calea dată a fost: ''​C->​Users->​Documents->​Visual Studio 2010->​Projects''​.
  
-   * Punctaj: **1 punct**+Închideți programul și deschideți-l din nou folosind una din metodele următoare: 
 +  ​click dreapta pe fișierul ''​ProiectSO.sln → Open with → Microsoft Visual C++ 2010 Express'';​ 
 +  ​Din cadrul aplicației Microsoft Visual C++ 2010 Express. Accesați ''​File→Open→Project/​Solution''​ și alegeți fișierul .sln care conține proiectele de interes.
  
-Pentru a crea un proiect nou selectați //File// -> //New// -> //Project//. +=== 1bAdăugare fișier la proiect ===
-Pe ecran o să apară o fereastră nouă. Selectați //Win32 Console Application//​. +
-În partea de jos a ferestrei, specificați un nume proiectului ​și apăsați butonul ''​OK''​.+
  
-Se va deschide ​un nou wizardApăsați butonul ''​Next''​ pentru a începe etapa de configurare. +Vom adăuga ​un fișier (deja existent) la proiectÎn fereastra Solution Explorer (din stânga) selectați Source filesDați click dreapta → Add → Existing Item. Folosind explorerul deschis, selectați fișierul ''​so/labs/lab01/skel/win/VS Tutorial/debug.c''​. Calea completă pentru fișier este: ''​C:​\cygwin\home\Student\so\labs\lab01\skel\win\VS Tutorial''​. ​
-Selectați următoarele proprietări:​ +
-   * //​Application type// == //Console Application//;​ +
-   * bifați opțiunea ​//Empty Project// din secțiunea //​Additional options//. +
-Apoi puteți apăsa butonul ​''​Finish''​.+
  
-Vom adăuga un fișier (deja existent) la proiect. +=== 1cCompilarea proiectului ===
-În fereastra //Solution Explorer// (din stânga) selectați //Source files//. Dați click dreapta -> //Add// -> //Existing Item//. +
-O să apară o nouă fereastră din care vom selecta fișierul ''​win/​VS Tutorial/​debug.c''​.+
  
-Compilați.+Pentru a compila proiectul selectați ''​Build → Build Solution''​ sau apăsați tasta **F7**. În fereastra ''​Output''​ se poate observa output-ul procesului de compilare.
  
-Pentru a vedea prima eroare, apăsați ​tasta **F8**. Cu **F8** și **Shift+F8** se poate naviga între erorile de compilare.+În acest caz, compilarea **nu** se efectuează cu succes. ​Pentru a vedea prima eroare, apăsați ​tasta **F8**. Cu **F8** și **Shift+F8** se poate naviga între erorile de compilare. Modificați antetul funcției ''​f''​ astfel încât să întoarcă ''​int''​. Compilați din nou și observați că de data aceasta compilarea s-a încheiat cu succes.
  
-Modificați antetul funcției ''​f''​ astfel încât să întoarcă ''​int''​.+=== 1dRularea proiectului ===
  
-Compilați din nou și rulați.  +Pentru a rula proiectul selectați ''​Debug → Start Without Debugging''​ sau tastați **Ctrl+F5**. Programul va afișa pe ecran un mesaj după care o să crape.
-Programul va afișa pe ecran un mesaj după care o să crape.+
  
-=== 2c. Debugging ===+=== 1e. Debugging ===
  
-   * Punctaj: **1 punct**+Programul anterior ar trebui să afișeze valoarea salvată în variabila bug. După cum am observat, programul crapă înainte de a face acest lucru.
  
-Programul anterior ar trebui să afișeze valoarea salvată în variabila ​''​bug''​.  +Vom adăuga un breakpoint la funcția ​''​f''​: click pe linia cu definiția funcției și apoi apăsați tasta **F9**. Veți observa un cerculeț roșu în dreptul liniei ca în imaginea ​de mai jos. Folosind **F9** puteți ​face toggle între breakpoint-uri.
-După cum am observat, programul crapă înainte ​de face acest lucru.+
  
-Vom adăuga un breakpoint la funcția ''​f''​. +{{:​so:​laboratoare:​lab01-win-debug3.png?200|}}
-   * click pe linia cu definiția funcției (linia 6) și apoi apăsăm tasta **F9**. +
-   * observați cerculețul roșu+
  
-Rulați ​programul ​în mediul de debug apăsând tasta **F5**. +Rulați ​aplicația ​în modul debugging ​apăsând tasta **F5**. Programul a început execuția și s-a oprit în primul breakpoint întâlnit (cel adăugat anterior).
-Programul a început execuția și s-a oprit în primul breakpoint întâlnit (cel adăugat anterior).+
  
-Pentru a continua execuția step-by-stepselectați //Debug// -> //Step Over// sau apăsați tasta **F10**. +Pentru a urmări valorile diverselor variabile, vom seta watch-uri pentru variabilele ''​a'',​ ''​b''​''​c''​ și ''​bug''​. Selectați ''​Debug → Windows → Watch → Watch1''​ și adăugați pe rând numele variabilelor
-Observați faptul că săgeata galbenă a înaintat.+
  
-Pentru a urmări valorile diverselor variabile, vom seta watch-uri pentru variabilele ''​a'',​ ''​b'',​ ''​c''​ și ''​bug''​. +{{:so:​laboratoare:​lab01-win-debug1.png?200|}}
-   * selectați //Debug// -> //Windows// -> //Watch// -> //​Watch1//;​ +
-   * adăugați pe rând numele variabilelor. +
-   ​* ​{{so:​laboratoare:​vs_set_watch.png?450|}}+
  
-Vom continua rularea programului step-by-step (**F10**) și vom observa cum se schimbă valoarea variabilei ​''​bug''​, cât și mesajele afișate în fereastra Output.+Observați săgeata care indică următoarea instrucțiune ce va fi executată, dar și valorile variabilelor. De ce variabila ''​c''​ apare cu eroare? 
 + 
 +Pentru a continua execuția step-by-step,​ selectați ''​Debug → Step Over''​ sau apăsați tasta **F10**. Observați faptul că săgeata galbenă a înaintat. ​Vom continua rularea programului step-by-step (**F10**) și vom observa cum se schimbă valoarea variabilei bug, cât și mesajele afișate în fereastra ​''​Output''​.
  
 Remediați problema și rulați din nou programul. Remediați problema și rulați din nou programul.
  
-Mai multe informații utile despre Visual Studio găsiți [[so:​laboratoare:​resurse:​vs_tips ​| aici]]. +Mai multe informații utile despre Visual Studio găsiți [[so:​laboratoare:​resurse:​windows-laborator:​tutorial-visual-studio ​| aici]]. 
-==== Exercițiul ​- Makefiles ​(2p) ====+==== Exercițiul ​- Makefiles ====
  
 <note warning> <note warning>
-Acest set de exerciții se rulează din command-shell-ul Windows PowerShell (**nu** ''​cmd.exe''​).+Acest set de exerciții se rulează din command-shell-ul Windows ​Developer ​PowerShell (**nu** ''​cmd.exe''​).
       * Găsiți link la acesta pe Desktop sau accesând //Tools// -> //​PowerShell Command Prompt//.       * Găsiți link la acesta pe Desktop sau accesând //Tools// -> //​PowerShell Command Prompt//.
 +      * Mai multe informații despre folosirea PowerShell pentru laborator găsiți [[:​so:​laboratoare:​resurse:​windows-laborator:​windows-cli#​powershell | aici ]].
 </​note>​ </​note>​
  
-=== 3a. Compilarea unui singur fișier ​(1p) === +=== 2a. Compilarea unui singur fișier === 
  
 Intrați în directorul ''​win/​1-hello''​. Intrați în directorul ''​win/​1-hello''​.
Line 1350: Line 1337:
 </​code>​ </​code>​
  
-=== 3b. Compilarea din mai multe surse (1p) ===+=== 2b. Compilarea din mai multe surse ===
  
 Intrați în directorul ''​win/​2-debug''​. Intrați în directorul ''​win/​2-debug''​.
Line 1362: Line 1349:
    * să obțineți obiecte din sursele ''​main.c''​ și ''​add.c''​ și executabilul ''​main.exe''​ (ca la subpunctul precedent)    * să obțineți obiecte din sursele ''​main.c''​ și ''​add.c''​ și executabilul ''​main.exe''​ (ca la subpunctul precedent)
 **Hint**: Revedeți secțiunea [[#​compilatorul_microsoft_clexe|cl]]. **Hint**: Revedeți secțiunea [[#​compilatorul_microsoft_clexe|cl]].
 +
 +==== Bonus - Bibliotecă statică ====
 +Intrați în directorul ''​win/​3-bounds''​. Analizați fișierele ''​bounds.c'',​ ''​min.c''​ și ''​max.c''​.
 +
 +Analizați fișierul ''​Makefile.dynamic''​. Observați construcțiile  ''​%%__%%declspec(dllimport)''​ și ''​%%__%%declspec(dllexport)''​ adăugate antetelor funcțiilor. Pentru mai multe detalii despre utilitatea acestora, consultați informațiile de pe [[https://​docs.microsoft.com/​en-us/​cpp/​build/​importing-function-calls-using-declspec-dllimport?​view=msvc-160|acest link]].
 +
 +Completați fișierul ''​Makefile.static''​ astfel încât:
 +
 +  * La rularea ''​nmake bounds_static.lib''​ să se creeze biblioteca statică ''​bounds_static.lib''​. Biblioteca va conține fișierele obiect asociate fișierelor ''​min.c''​ și ''​max.c''​.
 +  * La rularea comenzii ''​nmake''​ să se creeze fișierul executabil ''​bounds_static.exe''​ obținut din legarea fișierului obiect corespunzător fișierului ''​bounds.c''​ cu biblioteca ''​bounds_static.lib''​.
 +
 +Hints: Revedeți secțiunea [[so:​laboratoare:​laborator-01#​crearea_unor_biblioteci_statice|Crearea unor biblioteci statice]].
 +
 ===== Linux ===== ===== Linux =====
  
Line 1374: Line 1374:
 </​note>​ </​note>​
 */ */
-==== Exercițiul ​- Fișiere make ====+==== Exercițiul ​- Fișiere make ====
  
-=== 4a. Compilarea unui singur fișier ===+=== 3a. Compilarea unui singur fișier ===
  
 Intrați în directorul ''​lin/​1-hello/''​ și analizați conținutul fișierului ''​hello.c''​. ​ Intrați în directorul ''​lin/​1-hello/''​ și analizați conținutul fișierului ''​hello.c''​. ​
Line 1390: Line 1390:
 </​code> ​ </​code> ​
  
-=== 4b. Creare biblioteci statice ===+=== 3b. Creare biblioteci statice ===
  
 Intrați în directorul ''​lin/​2-lib/''​ și completați fișierul ''​Makefile_static''​ astfel încât: Intrați în directorul ''​lin/​2-lib/''​ și completați fișierul ''​Makefile_static''​ astfel încât:
Line 1398: Line 1398:
 Revedeți secțiunea crearea unei [[#Crearea unei biblioteci statice|biblioteci statice]]. Revedeți secțiunea crearea unei [[#Crearea unei biblioteci statice|biblioteci statice]].
  
-=== 4c. Creare biblioteci dinamice ===+=== 3c. Creare biblioteci dinamice ===
  
 Rămâneți în directorul ''​lin/​2-lib/''​ și completați fișierul ''​Makefile_dynamic''​ reguli astfel încât: Rămâneți în directorul ''​lin/​2-lib/''​ și completați fișierul ''​Makefile_dynamic''​ reguli astfel încât:
Line 1439: Line 1439:
     * [[http://​en.wikipedia.org/​wiki/​Java_Native_Interface|JNI]]     * [[http://​en.wikipedia.org/​wiki/​Java_Native_Interface|JNI]]
  
-===== Soluții ===== 
- 
-[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab01-sol.zip | lab01-sol.zip]]- 
  
 ===== Resurse utile ===== ===== Resurse utile =====
so/laboratoare/laborator-01.txt · Last modified: 2022/03/09 15:31 by teodor_stefan.dutu
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