CS107 C programok fordítása a GCC-vel
Az írás szerzője Chris Gregg, a módosításokat Nick Troccoli végezte
Kattints ide az útmutató videóért.
A CS107-ben használt fordító a “GNU Compiler Collection” (gcc). Ez az egyik legszélesebb körben használt fordítóprogram, amely egyrészt szabad szoftver, másrészt számos különböző számítástechnikai platformon elérhető.
gcc
elvégzi a fordítási lépést a program összeállításához, majd más programokat hív meg a program összeállításához és a program összetevőinek összekapcsolásához egy futtatható programmá, amelyet futtathatunk. Mindegyik lépésről tanulni fogunk egy kicsit a CS107 során, de az a szép dolog, hogy a gcc
egyetlen paranccsal elő tudja állítani számodra a teljes futtatható (futtatható) programot.
A CS107 során túlnyomórészt Makefile-okat fogunk használni a kódunk lefordítására, összerakására és összekapcsolására, de a Makefile a gcc
-t futtatja, hogy elvégezze a munkát. 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!$
Általában nem akarjuk, hogy a programjainkat a.out
nevezzük, ezért megadhatunk egy gcc
opciót, -o programName
, hogy megmondjuk, mi legyen a futtatható fájl neve:
$ gcc hello.c -o hello$ ./helloHello, World!$
Figyeljen arra, hogy véletlenül se adjon meg olyan futtatható fájlnevet, amely megegyezik a bemeneti fájl nevével – például:
$ gcc hello.c -o hello.c
A myth
profilja úgy lett beállítva, hogy a hibát észlelje és ne fordítsa le, így a forrásfájlja érintetlen marad. Sok más Linux rendszeren ez nem így van, ezért légy óvatos! Más rendszereken a GCC felülírná a forrásfájlodat az új futtathatóval.
gcc
számos különböző parancssori opciót (zászlókat) fogad el, amelyek megváltoztatják a viselkedését. Az egyik leggyakoribb flag az “optimalizációs szint” flag, -O
(nagybetűs ‘o’). gcc
képes optimalizálni a kódot különböző helyzetekben.
- -O vagy -O1: Optimalizálás. A fordítás optimalizálása valamivel több időt vesz igénybe, és sokkal több memóriát egy nagy függvény esetében. A
-O
használatával a fordító megpróbálja csökkenteni a kód méretét és a végrehajtási időt, anélkül, hogy a fordítási időt nagymértékben igénybe vevő optimalizálásokat végezne. - -O2: Még jobban optimalizál. A GCC szinte az összes olyan támogatott optimalizálást elvégzi, amely nem jár tér-gyorsasági kompromisszummal. A
-O
opcióhoz képest ez az opció növeli mind a fordítási időt, mind a generált kód teljesítményét. - -O3: Még tovább optimalizál.
-O3
bekapcsolja a-O2
által megadott összes optimalizálást, és további optimalizálásokat is bekapcsol. Gyakran ezt az opciót a legjobb használni. - -O0: Csökkenti a fordítási időt, és a hibakeresés a várt eredményeket hozza. Ez az alapértelmezett.
- -Os: Optimalizálás a méretre.
-Os
engedélyezi az összes-O2
optimalizálást, amely jellemzően nem növeli a kód méretét. Emellett további, a kódméret csökkentését célzó optimalizálásokat is végrehajt. - -Ofast: Figyelmen kívül hagyja a szigorú szabványoknak való megfelelést. engedélyezi az összes
-O3
optimalizálást. Olyan optimalizációkat is engedélyez, amelyek nem minden szabványnak megfelelő programra érvényesek. - -Og: Optimalizálja a hibakeresés élményét.
-Og
olyan optimalizálásokat engedélyez, amelyek nem zavarják a hibakeresést. Ennek kell lennie a választott optimalizálási szintnek a szabványos edit-compile-debug ciklushoz, amely ésszerű szintű optimalizálást kínál, miközben fenntartja a gyors fordítást és a jó hibakeresési élményt. A CS107-ben a-Og
-t fogjuk használni hibakereséskor.
Az optimalizálással kapcsolatos további részletekért lásd a man
oldal gcc
(vagy lásd itt az optimalizálással kapcsolatos további információkat).
Egy másik gyakori flag a -std=gnu99
opció, amely azt mondja a gcc
-nek, hogy az “1999-es c szabvány gnu c verzióját” használja. A szabvány olyan szintaxist biztosít, mint például az, hogy egy for ciklus deklarációján belül változót definiálhatunk (pl. for (int i = ...)
. Ezt a szabványt fogjuk használni a CS107-ben.
A -g
flaget is használni fogjuk, amely lehetővé teszi, hogy a debugger, a gdb segítségével pontos sorszámokat kapjunk a kódunkban, amikor futtatjuk azt.
Példa:
$ gcc -std=gnu99 -g -Og loop.c -o loop
Ha még több információ érdekel a gcc
-ről, nézd meg a Stanford Unix programozási eszközök dokumentum 1. szakaszát, valamint a teljes gcc kézikönyvet(GNU).