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. | ||
| + | |||