CS107 Compilarea programelor C cu GCC

Scris de Chris Gregg, cu modificări de Nick Troccoli

Click aici pentru o prezentare video.

Compilatorul pe care îl vom folosi pentru CS107 se numește „GNU Compiler Collection” (gcc). Este unul dintre cele mai utilizate compilatoare și este atât software liber, cât și disponibil pe multe platforme de calcul diferite.

gcc realizează etapa de compilare pentru a construi un program, apoi apelează alte programe pentru a asambla programul și pentru a lega părțile componente ale acestuia într-un program executabil pe care îl puteți rula. Vom învăța câte ceva despre fiecare dintre acești pași în timpul CS107, dar lucrul frumos este că poate produce întregul program executabil (executabil) pentru dumneavoastră cu o singură comandă.

În CS107, vom folosi predominant Makefile-uri pentru a compila, asambla și lega codul nostru, dar Makefile-ul execută gcc pentru a face munca. This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.

The simplest way to run gcc is to provide gcc a list of .c files:

$ gcc hello.c$

Note that you do not put header files (.h) into the gcc command: it reads in the header files as it compiles, based on the #include statements inside .c files.

If the program compiled without errors or warnings, you don’t get any output from gcc, and you will have a new file in your directory, called a.out. To run this file, you need to tell the shell to run the file in the current directory, by using ./ before the name:

$ ./a.outHello, World!$

În general, nu dorim ca programele noastre să se numească a.out, așa că îi puteți da lui gcc o opțiune, -o programName, pentru a-i spune cum să numească fișierul rulabil:

$ gcc hello.c -o hello$ ./helloHello, World!$

Nota: aveți grijă să nu introduceți din greșeală un nume de fișier executabil care să fie același cu cel al fișierului de intrare – ceva de genul:

$ gcc hello.c -o hello.c

La myth, profilul dvs. a fost configurat să detecteze eroarea și să nu o compileze, lăsând fișierul sursă intact. Acest lucru nu este cazul pe multe alte sisteme Linux, așa că aveți grijă! Pe alte sisteme, GCC ar suprascrie fișierul dvs. sursă cu noul executabil.

gcc ia multe opțiuni diferite de linie de comandă (stegulețe) care îi modifică comportamentul. Unul dintre cele mai comune stegulețe este stegulețul „nivel de optimizare”, -O (majusculă ‘o’). are capacitatea de a vă optimiza codul pentrudiverse situații.

  1. -O sau -O1: Optimizare. Optimizarea compilării necesită ceva mai mult timp și mult mai multă memorie pentru o funcție mare. Cu -O, compilatorul încearcă să reducă dimensiunea codului și timpul de execuție, fără a efectua optimizări care necesită o mare parte din timpul de compilare.
  2. -O2: Optimizează și mai mult. GCC efectuează aproape toate optimizările acceptate care nu implică un compromis spațiu-viteză. În comparație cu -O, această opțiune crește atât timpul de compilare, cât și performanța codului generat.
  3. -O3: Optimizează și mai mult. -O3 activează toate optimizările specificate de -O2 și, de asemenea, activează și alte optimizări. Aceasta este adesea cea mai bună opțiune de utilizat.
  4. -O0: Reduce timpul de compilare și face ca depanarea să producă rezultatele așteptate. Aceasta este opțiunea implicită.
  5. -Os: Optimizează pentru dimensiune. -Os activează toate -O2 optimizările care nu cresc de obicei dimensiunea codului. De asemenea, efectuează și alte optimizări concepute pentru a reduce dimensiunea codului.
  6. -Ofast: Nu ține cont de respectarea strictă a standardelor. -Ofast activează toate -O3 optimizările. De asemenea, permite optimizări care nu sunt valabile pentru toate programele conforme cu standardele.
  7. -Og: Optimizează experiența de depanare. -Og activează optimizările care nu interferează cu depanarea. Acesta ar trebui să fie nivelul de optimizare ales pentru ciclul standard de editare-compilare-depanare, oferind un nivel rezonabil de optimizare, menținând în același timp o compilare rapidă și o experiență bună de depanare. Vom folosi -Og în CS107 atunci când facem debugging.

Vezi pagina man pentru gcc pentru mai multe detalii despre optimizare (sau vezi aici pentru mai multe informații despre optimizări).

Un alt indicator comun este opțiunea -std=gnu99, care îi spune lui gcc să folosească „versiunea gnu c a standardului c din 1999”. Standardul oferă o sintaxă cum ar fi posibilitatea de a defini o variabilă în interiorul unei declarații for loop (de exemplu, for (int i = ...). Vom folosi acest standard în CS107.

Vom folosi, de asemenea, steagul -g, care ne permite să folosim debuggerul, gdb, pentru a ne oferi numere de linie exacte în codul nostru atunci când îl rulăm.

Exemplu:

$ gcc -std=gnu99 -g -Og loop.c -o loop 

Dacă sunteți interesați de și mai multe informații despre gcc, consultați Secțiunea 1 din acest document Stanford Unix Programming Tools, precum și manualul complet al gcc(GNU).