This shows you the differences between two versions of the page.
uso:laboratoare:new:04-appdev:basics [2018/10/23 21:16] razvan.deaconescu created |
uso:laboratoare:new:04-appdev:basics [2019/10/27 14:44] (current) elena.stoican [Compilarea unui fișier C] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Basics ===== | ===== Basics ===== | ||
- | TODO | + | Înainte de a începe să rezolvați laboratorul asigurați-vă că ați parcurs și |
+ | înțeles noțiunile prezentate în sectiuniile ''Concepte'' și ''Demo''. | ||
+ | |||
+ | ==== Scrierea unui program C ==== | ||
+ | |||
+ | La calea ''~/uso-lab/04-appdev/support/basics/simple.c'' se află un program simplu C care afișează bine-cunoscutul mesaj "Hello, World!". | ||
+ | |||
+ | <note> | ||
+ | Nu uita să folosești <TAB> pentru auto-completare, nu scrie de mână toată calea! | ||
+ | </note> | ||
+ | |||
+ | <code> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main(void) { | ||
+ | puts("Hello, World!"); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Compilarea unui fișier C ==== | ||
+ | |||
+ | Cel mai folosit compilator de C folosit pe Ubuntu este ''gcc''. Acesta va fi folosit și de noi În cardrul laboratorului să compilăm fișiere scrise în limbajul C. | ||
+ | Pentru a compila un fișier, rulăm comanda ''gcc'' urmată de numele fișierului pe care vrem să-l compilăm. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/uso-lab/04-appdev/support/basics/$ gcc simple.c | ||
+ | student@uso:~/uso-lab/04-appdev/support/basics/$ ls | ||
+ | a.out simple.c | ||
+ | student@uso:~/uso-lab/04-appdev/support/basics/$ file a.out | ||
+ | a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c5ad78cfc1de12b9bb6829207cececb990b3e987, not stripped | ||
+ | </code> | ||
+ | |||
+ | Outputul produs de această comandă este un fișier executabil cu numele ''a.out''. Comanda ''file'' ne ajută să inspectăm tipul fișierului dat ca argument. În acest caz, ne spune că fișierul ''a.out'' | ||
+ | este de tip ELF pe 64 de biți. | ||
+ | |||
+ | - De multe ori nu vrem ca executabilul rezultat să se numească a.out, ci vrem să aibă un nume mai intuitiv, spre exemplu ''simple''. Compilați programul ''simple.c'' astfel încât fișierul rezultat să se numească ''simple'' (hint: man gcc, căutați după cuvântul cheie ''outfile''). | ||
+ | - Folosind comanda ''file'', verificați că fișierul ''simple'' este într-adevăr un fișier executabil. | ||
+ | |||
+ | ==== Primii pași în lumea git-ului ==== | ||
+ | |||
+ | Așa cum a fost precizat și la secțiunea ''Concepte'', **git** ne ajută la versionarea codului. Versionarea codului este un pas | ||
+ | foarte important în dezvoltarea aplicațiilor. Atunci când lucrăm la un proiect mai mare sau suntem mai mulți oameni care lucrăm | ||
+ | la un proiect, este important să păstrăm o ordine în cod. Spre exemplu, ni se poate întâmpla să ne apucăm să implementăm un nou | ||
+ | feature al aplicației și să modificăm codul suficient de mult încât să stricăm ceea ce aveam înainte. În această situație, vrem | ||
+ | să avem o modalitate prin care să revenim la o versiune anterioară a codului. Un alt exemplu care demonstrează nevoia de a folosi | ||
+ | o modalitate de versionare este dat de situația în care 2 sau mai mulți oameni lucrează la același proiect, dezvoltă două | ||
+ | funcționalități diferite și nu vor să aibă probleme atunci când vor imbina cele 2 funcționalități în produsul mare. | ||
+ | |||
+ | Vom trece prin exemplele de mai sus în secțiunile următoare. Acum, ne vom concentra pe inițializarea proiectului. | ||
+ | |||
+ | - Înainte de toate, intrați pe [[https://github.com|Github]] sau pe [[https://bitbucket.org/|Bitbucket]] și creați-vă un cont. Vom folosi mai târziu acest cont pentru a ține repository-urile pentru proiectele la care lucrăm. | ||
+ | |||
+ | Pentru a putea versiona codul pe care îl scriem, trebuie întâi și întâi să avem un loc în care să scriem codul. Ne reamintim din | ||
+ | laboratoarele anterioare cum se creează un director în Linux. Să presupunem că pornim din directorul ''home'' al uitlizatorului | ||
+ | ''student''. Dacă nu vă aflați acolo, rulați comanda ''cd ~''. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~$ mkdir my-awesome-project | ||
+ | student@uso:~$ cd my-awesome-project | ||
+ | student@uso:~/my-awesome-project$ | ||
+ | </code> | ||
+ | |||
+ | În acest moment, avem directorul în care vom lucra la proiectul nostru. Pentru a preciza sistemului că vrem să folosim ''git'' | ||
+ | pentru versionare, trebuie să dăm comanda ''git init''. Această comandă creează un **repository local** nou în care vor fi | ||
+ | ținute toate datele legate de proiect. Vom vorbi despre **repository-uri remote** la secțiunile următoare. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ git init | ||
+ | Initialized empty Git repository in /home/student/my-awesome-project/.git/ | ||
+ | student@uso:~/my-awesome-project$ | ||
+ | </code> | ||
+ | |||
+ | Dacă această comandă s-a executat cu succes, avem în acest moment un repository de ''git'' în directorul ''my-awesome-project''. Dacă dăm comanda | ||
+ | ''git status'' putem afla foarte ușor ce fișiere am modificat de la ultima actualizare a repository-ului. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ git status | ||
+ | # On branch master | ||
+ | # | ||
+ | # Initial commit | ||
+ | # | ||
+ | nothing to commit (create/copy files and use "git add" to track) | ||
+ | student@uso:~/my-awesome-project$ | ||
+ | </code> | ||
+ | |||
+ | Dat fiind faptul că nu am create/șters/modificat niciun fișier din directorul ''my-awesome-project'', comanda ''git status'' ne spune că nu avem | ||
+ | nicio schimbare pe care să o "comitem", adică nu avem nicio schimbare în directorul curent pe care ar trebui să o anunțăm. | ||
+ | |||
+ | === README și .gitignore === | ||
+ | |||
+ | Uzual, orice proiect vine atașat cu 2 fișiere ''README'' și un fișier ''.gitignore''. Fișierul ''README'' conține informații despre cum este structurat | ||
+ | proiectul, despre cum se folosește, practic conține orice are nevoie pentru a putea ajuta pe cineva (care nu a lucrat la proiect). Fișierul ''.gitignore'' | ||
+ | este fișierul care îi spune utilitarului ''git'' ce fișiere să ignore atunci când cineva adaugă fișiere la repository. Spre exemplu, fișierele binare | ||
+ | nu trebuie adăugate niciodată în repository deoarece este **foarte**, atenție **foarte**, probabil ca un program compilat pe un sistem să nu fie compatibil | ||
+ | pe un altul. | ||
+ | |||
+ | Primul pas pe care trebuie să-l facem după ce am inițializat repository-ul proiectului nostru este să adăugăm un fișier README, care va fi actualizat pe | ||
+ | parcursul dezvoltării și un fișier ascuns cu numele ''.gitignore''. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ echo "Initial content" > README # Scrie textul ''Initial content'' în fișierul ''README''. Fișierul este creat dacă nu exista deja. | ||
+ | student@uso:~/my-awesome-project$ echo "main" > .gitignore # Creează fișierul .gitignore cu conținutul ''main''. | ||
+ | student@uso:~/my-awesome-project$ git status | ||
+ | # On branch master | ||
+ | # | ||
+ | # Initial commit | ||
+ | # | ||
+ | # Untracked files: | ||
+ | # (use "git add <file>..." to include in what will be committed) | ||
+ | # | ||
+ | # .gitignore | ||
+ | # README | ||
+ | nothing added to commit but untracked files present (use "git add" to track) | ||
+ | </code> | ||
+ | |||
+ | Comanda ''git status'' ne arată că au fost modificate cele 2 fișiere, dar că sunt ''untracked'', adică nu au fost adăugate (încă în repository). Pentru a le adăuga, | ||
+ | trebuie să facem 2 pași. Prima dată, le adăugam în setul de fișiere ''tracked''. Pentru a face asta folosim comanda ''git add'' urmată de fișierele pe care vreți să | ||
+ | le adăugați, în cazul acesta ''README'' și ''.gitignore''. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ git add README .gitignore | ||
+ | student@uso:~/my-awesome-project$ git status | ||
+ | # On branch master | ||
+ | # | ||
+ | # Initial commit | ||
+ | # | ||
+ | # Changes to be committed: | ||
+ | # (use "git rm --cached <file>..." to unstage) | ||
+ | # | ||
+ | # new file: .gitignore | ||
+ | # new file: README | ||
+ | # | ||
+ | </code> | ||
+ | |||
+ | În acest moment ''git'' știe de fișierele ''README'' și ''.gitignore''. Vedem acest lucru cu ajutorul comenzii ''git status''. Al doilea pas este să comitem schimbările. | ||
+ | Acest lucru se face cu ajutorul comenzii ''git commit'' alături de argumentul ''-m <mesaj>''. Mesajul este o descriere a commit-ului, descrie ce modificări au fost | ||
+ | aduse odată cu aceasta versiune nouă de cod. ''git commit'' va lua toate fișierele adăugate la pasul anterior, le va marca pe toate cu același mesaj de commit și le va | ||
+ | submite în repository-ul local. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ git commit -m "Initial commit" | ||
+ | [master (root-commit) 64bccb0] Initial commit | ||
+ | Committer: student <student@uso> | ||
+ | |||
+ | 2 files changed, 2 insertions(+) | ||
+ | create mode 100644 .gitignore | ||
+ | create mode 100644 README | ||
+ | student@uso:~/my-awesome-project$ git status | ||
+ | # On branch master | ||
+ | nothing to commit, working directory clean | ||
+ | </code> | ||
+ | |||
+ | La o nouă rulare a comenzii ''git status'' vedem că schimbările au fost efectuate cu succes. Pentru a vedea istoricul commiturilor | ||
+ | făcute pentru acest repository rulăm comanda ''git log''. Acum trebuie să vedem că a fost efectuat un singur commit de-a lungul timpului | ||
+ | și anume cel cu identificatorul ''64bccb03c2f3a8e76730582676bd944902a0c1eb''. Acest șir de caractere în hexazecimal este generat aleator și este unic pentru fiecare commit, ajutându-ne astfel să identificăm commit-urile în cazul în care ar exista mai multe cu același nume. | ||
+ | |||
+ | <code bash> | ||
+ | student@uso:~/my-awesome-project$ git log | ||
+ | commit 64bccb03c2f3a8e76730582676bd944902a0c1eb | ||
+ | Author: student <student@uso> | ||
+ | Date: Mon Oct 7 15:49:20 2019 +0300 | ||
+ | |||
+ | Initial commit | ||
+ | </code> | ||
+ | |||
+ | - Creați un program C cu numele ''main.c'' în directorul ''~/my-awesome-project/'' care să afișeze mesajul "Hello, World!". | ||
+ | - Verificați faptul că ''git'' vede această schimbare folosind comanda ''git status''. Ar trebui să vedeți următorul output: | ||
+ | <code bash> | ||
+ | # On branch master | ||
+ | # | ||
+ | # Initial commit | ||
+ | # | ||
+ | # Untracked files: | ||
+ | # (use "git add <file>..." to include in what will be committed) | ||
+ | # | ||
+ | # main.c | ||
+ | </code> | ||
+ | - Comiteți noile schimbări și asigurați-vă că totul este în regulă. Nu treceți mai departe dacă vreo comandă pe care ați dat-o nu funcționează. La final, ''git status'' nu ar trebui să mai găsească niciun fișier ca 'tracked'. Verificați folosind ''git log'' sau chemând asistentul. | ||
+ |