This shows you the differences between two versions of the page.
uso:laboratoare:new:04-appdev:need-to-know [2019/10/10 12:56] liza_elena.babu |
uso:laboratoare:new:04-appdev:need-to-know [2019/10/24 11:23] (current) adrian.zatreanu [Automatizarea procesului de compilare - Makefile] |
||
---|---|---|---|
Line 44: | Line 44: | ||
Se observă faptul că pe lângă bibliotecile standard ''stdio'' și ''stdlib'', ''main.c'' mai are nevoie de câteva resurse externe și | Se observă faptul că pe lângă bibliotecile standard ''stdio'' și ''stdlib'', ''main.c'' mai are nevoie de câteva resurse externe și | ||
- | anume ''a.h'' și ''b.h''. În aceste 2 fișiere găsim definiții de **funcții** și/sau **variable** pe care vrem să le folosim în ''main.c''. | + | anume ''a.h'' și ''b.h''. În aceste 2 fișiere găsim declarații de **funcții** și/sau **variable** pe care vrem să le folosim în ''main.c''. |
**a.h** | **a.h** | ||
Line 68: | Line 68: | ||
</code> | </code> | ||
- | Fiecare fișier header vine asociat cu un fișier cod sursă în care sunt declarate toate funcțiile/variabilele definite în headere. | + | Fiecare fișier header vine asociat cu un fișier cod sursă în care sunt definite toate funcțiile/variabilele declarate în headere. |
Fișierele cod sursă includ toate headerele asociate. Spre exemplu, ''a.c'' include fișierul ''a.h'', la fel și pentru ''b.c''. | Fișierele cod sursă includ toate headerele asociate. Spre exemplu, ''a.c'' include fișierul ''a.h'', la fel și pentru ''b.c''. | ||
Trebuie reținut faptul că pentru a putea avea un program funcțional, trebuie să fie compilate toate fișierele cod sursă. | Trebuie reținut faptul că pentru a putea avea un program funcțional, trebuie să fie compilate toate fișierele cod sursă. | ||
Line 90: | Line 90: | ||
<note warning> | <note warning> | ||
- | **NU** includeți niciodată declarații în fișiere header. Fișierele header sunt **doar** pentru definiții, fișierele cod sursă sunt cele | + | **NU** includeți niciodată definiții în fișiere header. Fișierele header sunt **doar** pentru declarații, fișierele cod sursă sunt cele |
care trebuie să conțină implementarea. | care trebuie să conțină implementarea. | ||
</note> | </note> | ||
Line 96: | Line 96: | ||
- Rulați programul ''main'' și asigurați-vă că rularea lui se termină cu succes. | - Rulați programul ''main'' și asigurați-vă că rularea lui se termină cu succes. | ||
- Urmăriți pașii de mai jos: | - Urmăriți pașii de mai jos: | ||
- | - Definiți o funcție cu numele ''bad'' fără parametri care nu întoarce nimic în fișierul ''a.h'' (Atenție: doar definiția!). | + | - Declarați o funcție cu numele ''bad'' fără parametri care nu întoarce nimic, în fișierul ''a.h'' (Atenție: doar declarația!). |
- În fișierul ''main.c'', înainte de linia ''return 0'', apelați această funcție (''bad()''). | - În fișierul ''main.c'', înainte de linia ''return 0'', apelați această funcție (''bad()''). | ||
- Compilați din nou acest program (cu aceeași comandă pe care ați văzut-o mai sus). Ce s-a întâmplat? Care este motivul? Discutați cu asistentul. | - Compilați din nou acest program (cu aceeași comandă pe care ați văzut-o mai sus). Ce s-a întâmplat? Care este motivul? Discutați cu asistentul. | ||
Line 102: | Line 102: | ||
<note> | <note> | ||
- | De fiecare dată când vreți să apelați o funcție definită într-un fișier header, trebuie să existe o declarație / implementare a ei într-un | + | De fiecare dată când vreți să apelați o funcție declarată într-un fișier header, trebuie să existe o definiție / implementare a ei într-un |
fișier cod sursă, altfel programul nu este complet și nici corect! | fișier cod sursă, altfel programul nu este complet și nici corect! | ||
</note> | </note> | ||
Line 111: | Line 111: | ||
programelor C folosesc funcții din aceastea bibliotecă și s-a hotărât să fie linkată întotdeauna, însă aceasta nu este singura bibliotecă | programelor C folosesc funcții din aceastea bibliotecă și s-a hotărât să fie linkată întotdeauna, însă aceasta nu este singura bibliotecă | ||
externă pe care putem să o folosim. Putem să creăm noi o bibliotecă și să o linkăm programului nostru sau să folosim o bibliotecă deja | externă pe care putem să o folosim. Putem să creăm noi o bibliotecă și să o linkăm programului nostru sau să folosim o bibliotecă deja | ||
- | existentă cum ar fi biblioteca ce conține funcții matematice''math''. | + | existentă cum ar fi biblioteca ce conține funcții matematice ''math''. |
Pentru a folosi biblioteca ''math'' în programul nostru, trebuie să facem 2 lucruri. | Pentru a folosi biblioteca ''math'' în programul nostru, trebuie să facem 2 lucruri. | ||
- | - Să includem headerul ''math.h'' în program, pentru a putea preciză că se vor folosi funcții definite acolo. | + | - Să includem headerul ''math.h'' în program, pentru a putea preciză că se vor folosi funcții declarate acolo. |
- În momentul în care compilăm programul nostru, trebuie să-i precizăm compilatorului că noi folosim funcții din biblioteca ''math.h'' și că vrem ca binarul nostru să fie linkat cu biblioteca ''math''. | - În momentul în care compilăm programul nostru, trebuie să-i precizăm compilatorului că noi folosim funcții din biblioteca ''math.h'' și că vrem ca binarul nostru să fie linkat cu biblioteca ''math''. | ||
Line 135: | Line 135: | ||
int main(void) { | int main(void) { | ||
- | int x; | + | float x; |
printf("Give me a number: "); | printf("Give me a number: "); | ||
scanf("%f", &x); | scanf("%f", &x); | ||
Line 144: | Line 144: | ||
<note> | <note> | ||
- | Observați faptul că am include biblioteca ''math.h'' pentru a putea folosi funcția ''sqrt'' pentru calcularea radicalului unui număr. | + | Observați faptul că am inclus biblioteca ''math.h'' pentru a putea folosi funcția ''sqrt'' pentru calcularea radicalului unui număr. |
</note> | </note> | ||
Line 169: | Line 169: | ||
student@uso:~/uso-lab/04-appdev/support/need-to-know/using-math$ ./main | student@uso:~/uso-lab/04-appdev/support/need-to-know/using-math$ ./main | ||
Give me a number: 1234 | Give me a number: 1234 | ||
- | The square root for it is: 33925.795731 | + | The square root for it is: 35.128336 |
</code> | </code> | ||
Line 199: | Line 199: | ||
Atenție! Regulile în Makefile trebuie scrise la stânga de tot (fără spații la începutul rândului), iar comenzile aferente fiecărei reguli | Atenție! Regulile în Makefile trebuie scrise la stânga de tot (fără spații la începutul rândului), iar comenzile aferente fiecărei reguli | ||
trebuie să se afle pe linia următoare, iar linia să înceapă cu <TAB>, **nu** spații. | trebuie să se afle pe linia următoare, iar linia să înceapă cu <TAB>, **nu** spații. | ||
- | <note> | + | </note> |
- Creați fișierul Makefile de mai sus la calea ''~/uso-lab/04-appdev/support/need-to-know/''. Denumiți fișierul ''Makefile''. | - Creați fișierul Makefile de mai sus la calea ''~/uso-lab/04-appdev/support/need-to-know/''. Denumiți fișierul ''Makefile''. | ||
Line 217: | Line 217: | ||
Vedem acum că a fost creat executabilul ''main'' pe care putem să-l rulăm în continuare. | Vedem acum că a fost creat executabilul ''main'' pe care putem să-l rulăm în continuare. | ||
- | - Rulați exetuabilul ''main'' și asigurați-vă că funcționează. | + | - Rulați executabilul ''main'' și asigurați-vă că funcționează. |
- Adăugați o regulă numită ''run'' în Makefile care să aibă drept comandă asociată chiar comanda cu care rulăm programul ''main''. Nu treceți mai departe până când partea aceasta nu este clară. | - Adăugați o regulă numită ''run'' în Makefile care să aibă drept comandă asociată chiar comanda cu care rulăm programul ''main''. Nu treceți mai departe până când partea aceasta nu este clară. | ||
- Ștergeți executabilul ''main'' folosind una dintre regulile definite în Makefile. | - Ștergeți executabilul ''main'' folosind una dintre regulile definite în Makefile. | ||
Line 235: | Line 235: | ||
</code> | </code> | ||
- | - La calea ''~/uso-labs/04-appdev/support/basics/'' creați un Makefile care să conțină regulile ''main'', ''run'' și ''clean''. Nu treceți mai departe până când asistentul confirmă că este în regulă. | + | - La calea ''~/uso-lab/04-appdev/support/need-to-know/'' creați un Makefile care să conțină regulile ''main'', ''run'' și ''clean''. Nu treceți mai departe până când asistentul confirmă că este în regulă. |