na obsah klávesové zkratky na hlavní stránku na menu

Překlad na příkazové řádce pomocí GCC

Zdrojový kód v jazyce C je nutné přeložit. V tomto článku si předvedem překlad jednoduchého programu pomocí překladače GCC a zmíníme editor Kate.

Editor Kate

Pro vývoj programů v jazyce C lze použít libovolný textový editor nebo nějaké z pokročilejších vývojových prostředí. K desktopovému prostředí KDE je dodáván mocný textový editor Kate. Jeho výhodou je integrovaná konzole. Spuštěný editor je na následujícím obrázku:

hlavní okno editoru Kate

hlavní okno editoru Kate

Jak vidíme, okno je rozděleno na tři části. V levém sloupci nalezneme seznam otevřených dokumentů. Neuložené dokumenty mají vedle svého jména symbol diskety. Vpravo nahoře se nachází vlastní okno editoru. Na toto místo můžeme psát vlastní kód. Vpravo dole je umístěn emulátor terminálu (konzole). Tu lze použít k volání překladače.

Překlad

Předpokládejme, že máme vytvořen program hello.c, který byl popsán v sekci První program. Program před vlastním překladem uložíme, abychom překládali aktuální podobu zdrojového kódu. V konzoli přejdeme do adresáře s programem (příkaz cd pro změnu adresáře, příkaz pwd pro vypsání aktuálního umístění, příkaz ls pro vypsání adresáře). Překlad lze provést jednoduchým zapsáním příkazu

gcc hello.c

Vypíšeme-li si obsah adresáře, najdeme v něm nový soubor a.out. To je náš přeložený program. Takto zvláštně překladač náš výsledný program pojmenoval, protože jsme mu neurčili žádné vlastní jméno.

Program lze spustit voláním

./a.out

výstupem programu pak bude

hello world

Parametry GCC

GCC poskytuje skrze parametry příkazové řádky nesmírně rozsáhlé možnosti konfigurace. My zde uvedeme jen parametry pro nás zajímavé:

-o <jméno>
Nastaví jméno výstupního programu.
-O<0|1|2|3|s>
Nastaví úroveň optimalizace. 0 je žádná optimalizace, 3 je nejvyšší úroveň optimalizace, s je optimalizace pro co nejmenší velikost. Základní nastavení je 0.
-Wall
Zapne všechna varování.
-pedantic
Zapne striktní mód podle normy C.
-g
Do výsledného programu přidá ladící informace. Nutné pro ladění pomocí gdb a ostatních programů.
-l<knihovna>
Použije při spojování uvedenou dynamickou knihovnu. Název je uváděn bez úvodního lib, tedy připojení matematické knihovny libm provedeme zápisem -lm.

Pokud bychom tedy chtěli přeložit náš program s optimalizací první úrovně, se zapnutými varováními a názvem programu hello, zavoláme

gcc hello.c -o hello -O1 -Wall

Chyby v překladu

V případě, že máme vše v pořádku a program se přeloží, nevypíše překladač žádnou zprávu. V případě chyby nám překladač sdělí, na které řádce zdrojového kódu je něco špatně a co se mu nelíbí. Poznat z výpisu příčinu chyby je mnohdy náročné a vyžaduje to dobrou znalost jazyka C.

Chyby mohou nastat ve všech třech částech překladu programu. Chyby preprocesoru jsou typicky omezeny na nenalezení připojovaného souboru:

bity.c:1:20: fatal error: sstdio.h: No such file or directory
compilation terminated.

V tomto případě je nutné zkontrolovat jméno připojovaného souboru a opravit překlep. Pokud připojujeme vlastní zdrojové soubory, měli bychom se ujistit, že je překladač dokáže najít. Pro přidání vlastní cesty slouží přepínač -I.

Chyby při překladu jsou asi nejčastější. Každá taková chyba říká, že je náš program syntakticky nesprávně, a že překladač nerozumí kódu, který mu předkládáme. Chybových výpisů existuje nepřeberné množství a někdy mohou být zavádějící. Obecně je dobré zkontrolovat řádku, na které má být chyba, a též jednu řádku nad označeným místem. V následujícím kódu je syntaktická chyba na řádce šest, ale překladač označí až řádku sedm.

#include <stdio.h>

int main (int argc, char **argv)
{
  int a = 3;
  int b = 5
  printf("a je %d, b je %d\n", a, b);
  return 0;
}

Na řádce šest nám totiž chybí středník, na což překladač přijde, až když se pokusí najít pokračování příkazu z řádky šest na řádce sedm. Proto označí za místo chyby až řádek sedm.

bity.c: In function 'main':
bity.c:7:3: error: expected ',' or ';' before 'printf'

Posledním typem chyb jsou chyby při spojování. Poznat z takové chyby příčinu je mnohdy problém, protože překladač nám neoznačí žádné speciální místo v kódu. V nejvíce případech chyba nastane, když používáme některou z knihoven a zapomeneme ji připojit k programu. Kupříkladu následující kód:

#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
  int a = 3.0;
  double D = sqrt(a);
  printf ("%f\n", D);
  return 0;
}

se přeloží, ale nespojí. Překladač nám jen stroze oznámí, že nemůže najít odkaz na sqrt:

/tmp/ccrYY7Mk.o: In function `main':
main.c:(.text+0x2d): undefined reference to `sqrt'
collect2: ld returned 1 exit status

Řešením v tomto případě je připojení matematické knihovny pomocí parametru -lm.