This shows you the differences between two versions of the page.
uso:laboratoare:ac:laborator-06:make-intro [2020/11/10 09:06] 127.0.0.1 external edit |
uso:laboratoare:ac:laborator-06:make-intro [2021/11/10 21:56] (current) andrei.tivga |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Compilarea unui fișier cod sursă C ====== | ====== Compilarea unui fișier cod sursă C ====== | ||
- | În această secțiune urmărim să învățăm pașii pentru a compila un program, adică a-l aduce de la cod sursă la executabil. Pentru aceasta vom crea un program care verifică dacă un număr citit de la tastatură este prim sau nu. Vom scrie într-un nou fișier programul care implementează algoritmul, vom compila codul sursă folosind [[https://gcc.gnu.org|compilatorul GCC]] și vom testa că programul funcționează. | + | În această secțiune urmărim să învățăm pașii pentru a compila un program, adică a-l aduce de la cod sursă la executabil. Pentru aceasta vom crea un program care verifică dacă un număr citit de la tastatură este prim sau nu. |
+ | |||
+ | Pașii pe care îi vom face sunt: | ||
+ | * vom scrie într-un nou fișier cu extensia .c programul care implementează algoritmul | ||
+ | * vom compila codul sursă folosind [[https://gcc.gnu.org|compilatorul GCC]] | ||
+ | * vom testa că programul funcționează. | ||
===== Crearea unui fișier cod sursă ===== | ===== Crearea unui fișier cod sursă ===== | ||
Line 14: | Line 19: | ||
int i; | int i; | ||
- | for (i = 2; i <= n / 2; i++) { | + | for (i = 2; i < n / 2; i++) { |
if (n % i == 0) { | if (n % i == 0) { | ||
return 0; | return 0; | ||
Line 39: | Line 44: | ||
} | } | ||
</code> | </code> | ||
- | {{:uso:laboratoare:laborator-04:create-is-prime.gif?500|}} | + | {{:gifs/create-is-prime.gif}} |
Mai multe detalii despre folosirea editorului de text ''%%nano%%'' găsim în capitolul //Lucrul cu fișiere//. | Mai multe detalii despre folosirea editorului de text ''%%nano%%'' găsim în capitolul //Lucrul cu fișiere//. | ||
Line 45: | Line 50: | ||
===== Compilarea codului sursă în executabilul a.out ===== | ===== Compilarea codului sursă în executabilul a.out ===== | ||
- | Avem fișierul cod sursă ''%%is-prime.c%%'' și vrem să obținem un program pe care să-l rulăm pe sistemul nostru. Pentru aceasta, trebuie să compilăm fișierul ''%%is-prime.c%%''. Acest program este de fapt un **executabil** (//binar//). Executabilele sunt fișiere care conțin instrucțiuni pe care sistemul de calcul le poate interpreta și rula. | + | Avem fișierul cod sursă ''%%is-prime.c%%'' și vrem să obținem un program pe care să-l rulăm pe sistemul nostru. Pentru aceasta, trebuie să compilăm fișierul ''%%is-prime.c%%''. Acest program este de fapt un **executabil** (//fișier binar//). Executabilele sunt fișiere care conțin instrucțiuni pe care sistemul de calcul le poate interpreta și rula. |
- | Creăm un executabil din fișierul ''%%is-prime.c%%'' folosind comanda ''%%gcc%%'': | + | Creăm un executabil din fișierul ''%%is-prime.c%%'' folosind comanda ''%%gcc%%'': Astfel invocăm compilatorul GCC(GNU Compiler Collection) instalat anterior și îi dăm ca argument numele fișierului dorit. |
<code bash> | <code bash> | ||
Line 56: | Line 61: | ||
-rw-r--r-- 1 student student 406 Oct 26 06:17 is-prime.c | -rw-r--r-- 1 student student 406 Oct 26 06:17 is-prime.c | ||
</code> | </code> | ||
- | Așa cum vedem în rezultatul rulări comenzii ''%%ls -l%%'' de mai sus, executabilul se numește ''%%a.out%%''. Acesta este numele implicit dat de GCC. Adică ''%%a.out%%'' va fi numele tuturor fișierelor executabile generate cu GCC, indiferent de fișierul cod sursă. Verificăm că fișierul ''%%a.out%%'' este într-adevăr un fișier executabil: | + | Așa cum vedem în rezultatul rulări comenzii ''%%ls -l%%'' de mai sus, executabilul se numește ''%%a.out%%''. Acesta este numele **implicit** dat de GCC. Adică ''%%a.out%%'' va fi numele tuturor fișierelor executabile generate cu GCC, indiferent de fișierul cod sursă. Rulăm executabilul ''%%a.out%%'' în felul următor și introducem de la tastatură un număr: |
- | + | ||
- | <code bash> | + | |
- | student@uso:~$ file a.out | + | |
- | a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=14553360a84b6dbe4dba5f287a665047572bde7f, not stripped | + | |
- | </code> | + | |
- | Acronimele **ELF** (//Executable and Linkable Format) șiLSB//* (//Linux Standard Base//) nu sunt relevante în această carte, dar reținem că atunci când vedem un fișier **ELF**, acesta este un fișier //executabil//. | + | |
- | + | ||
- | Rulăm executabilul ''%%a.out%%'' în felul următor și introducem de la tastatură un număr: | + | |
<code bash> | <code bash> | ||
Line 86: | Line 83: | ||
-rwxr-xr-x 1 student student 8448 Oct 26 06:57 is-prime | -rwxr-xr-x 1 student student 8448 Oct 26 06:57 is-prime | ||
-rw-r--r-- 1 student student 406 Oct 26 06:17 is-prime.c | -rw-r--r-- 1 student student 406 Oct 26 06:17 is-prime.c | ||
- | student@uso:~$ file is-prime | + | |
- | is-prime: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=14553360a84b6dbe4dba5f287a665047572bde7f, not stripped | + | |
</code> | </code> | ||
Opțiunea ''%%-o%%'' urmată de numele ales pentru program (''%%is-prime%%'') transmite compilatorului ca programul să se numească ''%%is-prime%%'', și nu ''%%a.out%%''. Rulăm executabilul ''%%is-prime%%'' în felul următor și introducem de la tastatură un număr: | Opțiunea ''%%-o%%'' urmată de numele ales pentru program (''%%is-prime%%'') transmite compilatorului ca programul să se numească ''%%is-prime%%'', și nu ''%%a.out%%''. Rulăm executabilul ''%%is-prime%%'' în felul următor și introducem de la tastatură un număr: | ||
Line 107: | Line 103: | ||
{ | { | ||
int new_n = 0; | int new_n = 0; | ||
- | int old_n = n; | + | int original_n = n; |
while (n > 0) { | while (n > 0) { | ||
Line 115: | Line 111: | ||
} | } | ||
- | return (new_n == old_n) ? 1 : 0; | + | return (new_n == original_n) ? 1 : 0; |
} | } | ||
Line 126: | Line 122: | ||
if (check_if_palindrome(n)) { | if (check_if_palindrome(n)) { | ||
- | printf("%d is a palindome\n", n); | + | printf("%d is a palindrome\n", n); |
} else { | } else { | ||
printf("%d is not a palindrome\n", n); | printf("%d is not a palindrome\n", n); | ||
Line 136: | Line 132: | ||
- Compilați fișierul ''%%is-palindrome.c%%'' într-un executabil cu numele ''%%a.out%%'' folosind ''%%gcc%%''. Verificați funcționalitatea programului. | - Compilați fișierul ''%%is-palindrome.c%%'' într-un executabil cu numele ''%%a.out%%'' folosind ''%%gcc%%''. Verificați funcționalitatea programului. | ||
- Compilați fișierul ''%%is-palindrome.c%%'' într-un executabil cu numele ''%%is-palindrome%%'' folosind ''%%gcc%%''. Verificați funcționalitatea programului. | - Compilați fișierul ''%%is-palindrome.c%%'' într-un executabil cu numele ''%%is-palindrome%%'' folosind ''%%gcc%%''. Verificați funcționalitatea programului. | ||
+ | |||