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í
-Ose 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
-Otato volba zvyšuje jak dobu kompilace, tak výkon generovaného kódu. - -O3: Ještě více optimalizovat.
-O3zapne všechny optimalizace určené-O2a 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.
-Ospovolí všechny-O2optimalizace, 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ů.
-Ofastpovoluje všechny-O3optimalizace. Povoluje také optimalizace, které neplatí pro všechny programy vyhovující standardům. - -Og: Optimalizuje zkušenosti s laděním.
-Ogpovoluje 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).