Nastavení překladače GCC

[  Překladač GCC  |  Překlad s knihovnou <math.h>  |  Překlad programu  |  Přepínače kontrolující výstup  |  Volba dialektu jazyka C/C++  |  Informace pro debugger, optimalizace  |  Varování, chyby  ]

Překladač GCC

GCC znamená GNU Compiler Collection. Jak název napovídá, jde o kolekci programů určených pro překlad programů napsaných v různých jazycích. V současné verzi (3.4) je podporováno několik programovacích jazyků (C, C++, Objective C, assembler, Ada, Java, Fortran77). Primárně je však tento překladač určen pro překlad jazyků C, C++ a Assembleru. Tento překladač funguje v současné době na většině hlavních platforem (Unix, Windows, MacOS; Intel, PPC, Sparc, různé jednočipy, a jiné).

Nejdůležitějšími programy jsou překladač, preprocesor, assembler a sestavovací program (linker). Člověk však naštěstí nemusí znát konkrétní jména těchto programů. Stačí volat pouze překladač (gcc pro jazyk C, g++ pro jazyk C++) a ten potom podle použitých parametrů zavolá ty správné programy ve správném pořadí.

Překlad programu

Předpokládejme, že jste napsali klasický program Hello world a uložili jej do souboru helloworld.c

#include <stdio.h>

int main(void)
{
  printf("Tě péro sombréro!\n");
  return 0;
}

V Linuxu tento soubor přeložíme následujícím příkazem:

$ gcc helloworld.c

Překladač vytvoří spustitelný soubor a.out, který po spuštění vypíše text:

$ ./a.out
Tě péro sombréro!
$

Při tomto způsobu překladu jsme ponechali implicitní nastavení překladače. Není ovšem dobré spoléhat na standardní nastavení. Překladač v tomto stavu nehlídá všechny chyby, které by se v programu mohly vyskytnout. Zvláště začátečníci by měli překládat programy s poněkud přísnějším nastavením. Překladač potom bude vypisovat více varovných zpráv. Může se to sice zdát otravné, ale uvažte, že čím více chyb odhalí překladač už při překladu, tím více práce to ušetří při ladění.

$ gcc -std=c99 -Wall -pedantic -g helloworld.c -o hello

S tímto nastavením se budou překládat všechny projekty předmětu IZP. Pokud chcete překládat s ještě přísnějším nastavením, zkuste toto:

$ gcc -std=c99 -Wall -Werror -pedantic-errors -g helloworld.c -o hello

V prostředí Windows se překladač používá stejným způsobem. Rozdíl je v tom, že prostředí Windows není case-sensitive, takže je jedno, jestli soubory pojmenováváme velkými nebo malými písmeny. Aby byly programy přenositelné, je dobré si zvyknout pojmenovávat je výhradně malými písmeny. Vyhnete se tím případným problémům při přenosu programu do prostředí Linuxu.

Překlad s knihovnou <math.h>

Při překladu programu, který používá matematické funkce z math.h je nutné při překladu přidat přepínač -lm, který zajistí přilinkování matematické knihovny. Bez této knihovny sice půjde program přeložit, ale nepůjde jej slinkovat.

$ gcc -std=c99 -Wall -pedantic -g -lm matematika.c -o matematika

Používání knihoven je podrobněji probíráno v kapitole Moduly a knihovny.

$ gcc -std=c99 -Wall -pedantic -g -lm matematika.c -o matematika

Přepínače kontrolující výstup

Parametr Význam Poznámka
-c Pouze zkompiluje zdrojový soubor, ale neprovede linkování. Tento přepínač se používá při odděleném překladu více zdrojových souborů. Je možné jej použít pro syntaktickou kontrolu zdrojového souboru - je to pak rychlejší, protože se neprovádí kompilace, překladač pouze vypíše chyby a varovné zprávy.
-o soubor Uloží výstup do spustitelného souboru daného jména. Bez tohoto přepínače překladač vytváří soubor, který se jmenuje a.out (Linux) nebo a.exe (Windows).  
-E Překlad se zastaví po zavolání preprocesoru. Toto je užitečné, když se chcete podívat, zda se správně rozgenerovala makra.  
-S Překlad se zastaví po vygenerování kódu pro assembler. Toto používají zvrhlíci, které baví rochnit se ve změti instrukcí. Občas je možné ručně změnit pár instrukcí v rámci optimalizací, ale většinou assemblerový kód využijete tehdy, když chcete před někým dělat machra. ;-) Pozor! Pokud se vám pomocí tohoto povede sbalit životní partnerku, vystavujete se nebezpečí, že vaše děti budou mít ve škole přezdívky jako šprt, integrál nebo EAX!
-v Vypíše parametry, se kterými byl překladač sám přeložen, plus jeho verzi. Z těchto údajů se dají vyčíst zajímavé údaje, jako kde překladač očekává statické, či dynamické knihovny, nebo jestli zvládá vícevláknové aplikace. Podobnou funkci má i přepínač -###. Podrobnosti viz manuálovou stránku gcc.
--version Vypíše verzi překladače.  

Volba dialektu jazyka C/C++

Přepínač Popis Poznámka
-std=c99 Zapíná specifikaci jazyka C podle normy ISO z roku 1999. Tento přepínač rozhodně používejte! Zajistíte tím, že program bude přenositelný mezi moderními překladači na množství platforem a vyhnete se nechtěnému použití nestandardních rozšíření překladače GCC.
-std=c++98 Zapíná specifikaci jazyka C++ podle normy ISO z roku 1998. Pouze pro jazyk C++. Nepoužívat u Céčkových programů!
-ansi Zapíná specifikaci jazyka C podle normy ANSI. Tento přepínač je ekvivalentní přepínači -std=c89. Raději používejte -std=c99. Tento přepínač je použitelný, když chceme, aby byl program kompatibilní se starší verzí překladače.

Informace pro debugger, optimalizace

Parametr Význam Poznámka
-g, -g1, -g2, -g3 Překladač bude do výsledného kódu přidávat pomocné ladící informace pro debugger. Pokud při překladu není zvolen nějaký z těchto přepínačů, bude debugger schopen zobrazovat pouze informace na úrovni assembleru - nebude schopen zobrazovat názvy funkcí a proměnných. Číslo za přepínačem udává, jak podrobné ladící informace se budou generovat. Přepínač -g je ekvivalentní přepínači -g2. Tyto přepínače lze použít zároveň s přepínačem -O, ale většinou to nemá smysl. U starších verzí překladače to může působit potíže.
-ggdb, -ggdb1,
-ggdb2, -ggdb3
Podobné jako u přepínače -g, ale ladící informace budou optimalizovány pro debugger gdbg. Existují i jiné přepínače, kterými se dá zapnout optimalizace pro jiné debuggery, ale gdb je nejběžnější. Více viz manuálovou stránku gcc.
-O, -O1, -O2, -O3 Zapne optimalizaci výsledného kódu. Číslo za přepínačem specifikuje úroveň optimalizace. Přepínače -O a -O1 jsou ekvivalentní. Čím vyšší úroveň optimalizace zvolíte, tím delší dobu bude trvat překlad. Zvláště na pomalých strojích je vhodné zapínat optimalizace pouze při konečné kompilaci, ne při běžném psaní kódu. (Platí pro jednoduché projekty.) Tento přepínač používejte společně s přepínačem -g jenom když víte co děláte.
-Os Zapne optimalizaci kódu zaměřenou na velikost výsledného souboru. V podstatě zapne všechny optimalizace -O2, které nemají za následek zvětšení výsledného kódu, plus přidá některé další optimalizace. Používá se výjimečně
-O0 Vypne optimalizace. Tento přepínač je implicitně zapnut.  
-p, -pg Překladač bude do výsledného kódu přidávat informace použitelné pro profilovací analýzu programem prof nebo gprof (pro -pg). Profilování je statistická analýza běhu programu, ze které se dá zjistit, ve které funkci program tráví nejvíce času. Pokud vás svrbí prsty a rádi byste svůj program optimalizovali, nejprve proveďte profilovací analýzu. Optimalizovat funkci, která se vyvolá dvakrát během celého běhu programu, je mrhání vaším časem. Tento parametr je nutné použít i při linkování.

Varování, chyby

Parametr Význam Poznámka
-Wall Zapíná produkci varovných zpráv pro téměř všechny aspekty, které překladač umožňuje hlídat. Existuje velké množství parametrů -W..., které dovolují určovat konkrétní aspekty jazyka, které má překladač hlídat. Existují aspekty, které se pomocí -Wall nezapnou, ale ty se týkají výhradně jazyka C++. Velmi důležité pokud se chceme vyhnout množství nepříjemných chyb.
-pedantic Hlídá, jestli program striktně dodržuje normu ISO C nebo ISO C++ zadanou parametrem -std. Pokud program normu nedodržuje, vypisuje se varování. Velmi důležité pro psaní přenositelných programů.
-W Produkuje některá další užitečná varování. Zapnutím tohoto přepínače přinutíme překladač, aby prováděl (částečnou) sémantickou kontrolu kódu.  
-w Potlačí veškeré varovné zprávy. Pozor! Má naprosto jinou funkci než přepínač -W (velké písmeno), snadno se s ním plete a může způsobovat falešný pocit, že překládaný program je v naprostém pořádku.
-Werror Všechna varování interpretuje jako chyby. Pro začátečníky je velmi užitečné mít jej zapnutý.
-pedantic-errors Jako -pedantic, ale místo varování produkuje rovnou chyby. Pro začátečníky je velmi užitečné mít jej zapnutý.
Zdá se, že některé implementace GCC pod Windows používají v hlavičkových souborech nestandardní rozšíření, takže tento přepínač zde nejde použít.

Autor: David Martinek. Poslední modifikace: 11. února 2009. Pokud v tomto dokumentu narazíte na chybu, dejte mi prosím vědět.