CS107 Kompilování programů v jazyce C pomocí GCC
Napsal Chris Gregg, s úpravami Nicka Troccoliho
Klikněte zde pro video s postupem.
Kompilátor, který budeme používat v CS107, se nazývá „GNU Compiler Collection“ (gcc). Jedná se o jeden z nejpoužívanějších kompilátorů, který je jednak svobodným softwarem, jednak je k dispozici na mnoha různých počítačových platformách.
gcc
provede kompilační krok k sestavení programu a poté zavolá další programy k sestavení programu a k propojení jeho dílčích částí do spustitelného programu, který můžete spustit. O každém z těchto kroků se něco málo dozvíme během kurzu CS107, ale příjemné je, že gcc
dokáže celý spustitelný (spustitelný) program vytvořit za vás jediným příkazem.
V kurzu CS107 budeme ke kompilaci, sestavení a linkování našeho kódu používat převážně soubory Makefile, ale soubor Makefile spustí gcc
, aby vykonal práci. 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!$
Obvykle nechceme, aby se naše programy jmenovaly a.out
, takže můžete dát gcc
volbu -o programName
, která mu řekne, jak se má spouštěný soubor jmenovat:
$ gcc hello.c -o hello$ ./helloHello, World!$
Poznámka: dejte pozor, abyste omylem nezadali název spustitelného souboru, který je stejný jako váš vstupní soubor – něco jako:
$ gcc hello.c -o hello.c
Na myth
byl váš profil nastaven tak, aby zachytil chybu a nezkompiloval ji, přičemž váš zdrojový soubor zůstane nedotčen. V mnoha jiných systémech Linux tomu tak není, proto buďte opatrní! V jiných systémech by GCC přepsalo váš zdrojový soubor novým spustitelným souborem.
gcc
přijímá mnoho různých voleb příkazového řádku (příznaků), které mění jeho chování. Jedním z nejběžnějších příznaků je příznak „úroveň optimalizace“, -O
(velké písmeno „o“). gcc
má schopnost optimalizovat kód prorůzné situace.
- -O nebo -O1: Optimalizace. Optimalizace kompilace zabere poněkud více času a u rozsáhlých funkcí také mnohem více paměti. Pomocí
-O
se překladač snaží snížit velikost kódu a dobu jeho provádění, aniž by prováděl optimalizace, které zabírají mnoho času kompilace. - -O2: Optimalizuje ještě více. GCC provádí téměř všechny podporované optimalizace, které nezahrnují kompromis mezi místem a rychlostí. Ve srovnání s
-O
tato volba zvyšuje jak dobu kompilace, tak výkon generovaného kódu. - -O3: Ještě více optimalizovat.
-O3
zapne všechny optimalizace určené-O2
a zapne také další optimalizace. Tuto možnost je často nejlepší použít. - -O0: Zkrátí dobu kompilace a zajistí, aby ladění přineslo očekávané výsledky. Toto je výchozí nastavení.
- -Os: Optimalizuje pro velikost.
-Os
povolí všechny-O2
optimalizace, které obvykle nezvyšují velikost kódu. Provádí také další optimalizace určené ke snížení velikosti kódu. - -Ofast: Nedbá na přísné dodržování standardů.
-Ofast
povoluje všechny-O3
optimalizace. Povoluje také optimalizace, které neplatí pro všechny programy vyhovující standardům. - -Og: Optimalizuje zkušenosti s laděním.
-Og
povoluje optimalizace, které nezasahují do ladění. Měla by to být zvolená úroveň optimalizace pro standardní cyklus edit-compile-debug, která nabízí rozumnou úroveň optimalizace při zachování rychlé kompilace a dobrého zážitku z ladění. Při ladění budeme v CS107 používat-Og
.
Podrobnější informace o optimalizaci najdete na stránce man
pro gcc
(nebo zde).
Dalším běžným příznakem je volba -std=gnu99
, která říká gcc
, že se má použít „verze gnu c standardu c z roku 1999“. Standard poskytuje syntaxi, jako je možnost definovat proměnnou uvnitř deklarace cyklu for (např. for (int i = ...)
. Tento standard budeme používat v CS107.
Budeme také používat příznak -g
, který nám umožní používat ladicí program gdb, který nám při spuštění kódu poskytne přesná čísla řádků.
Příklad:
$ gcc -std=gnu99 -g -Og loop.c -o loop
Pokud vás zajímá ještě více informací o gcc
, přečtěte si část 1 tohoto dokumentu Stanford Unix Programming Tools a také celou příručku gcc(GNU).