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.

  1. -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.
  2. -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.
  3. -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.
  4. -O0: Zkrátí dobu kompilace a zajistí, aby ladění přineslo očekávané výsledky. Toto je výchozí nastavení.
  5. -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.
  6. -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.
  7. -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).