Překladače a vývojová prostředí

V této kapitole se dozvíte základy toho, co potřebujete k přeložení jednoduchého programu napsaného v jazyce C nebo C++ pod Linuxem.

Překladač

V Unixech existovali a existují různé překladače jazyka C (C++). V každé dobré Linuxové distribuci nějaký překladač (i kompletní vývojové prostředí) je. Nerozšířenější překladač v Linuxu, je GNU překladač gcc (pro jazyk C), resp. g++ (pro jazyk C++).

V historii se různé systémy (od různých vývojářů) dodávali s různými překladači, které se jmenovali cc (resp. c++) (lišili se nejen svými schopnostmi, ale i volbami pro překlad). Na systémech vyhovujících standardu POSIX se překladač jmenoval c89 (hádejte podle jakého standardu :-). Je možné (a pravděpodobné), že na svém sytému máte překladač gcc a cc jako symbolický odkaz na gcc.

Překladač gcc/g++ je stále nejpoužívanější, ale existuje i nový překladač se jménem clang. Tento překladač by měl dělat to samé (podporuje stejné argumenty příkazové řádky atp.) jako gcc, jen se snaží být rychlejší a generovat optimálnější kód. Taky má mnohem strozumitelnější chybové hlášky, takže vám doporučuji používat clang namísto gcc, alespoň dokud se učíte programovat.

Knihovny

Kromě překladačů budete využívat knihovny funkcí, např. knihovnu ncurses (později i ukážu, jak vytvářet vlastní knihovny funkcí). Pro překlad jsou potřeba hlavičkové soubory k těmto knihovnám. Jsou tam deklarovány funkce z těchto knihoven (přeložené definice funkcí jsou uloženy v knihovnách).

Například v Debianu Woody je balíček libncurses5, který obsahuje knihovnu ncurses a balíček libncurses5-dev, který obsahuje zdrojové kódy potřebné pro překlad programů využívajících ncurses. Pokud si instalujete nějaký program skrze balíčkovací systém vaší distribuce a tento program potřebuje ke svému běhu knihovnu z balíčku libncurses5, pak se automaticky tato knihovna také nainstaluje.
Pokud program budete překládat ze zdrojových kódů, budete si muset doinstalovat balíček libncurses5-dev sami. To platí obdobně pro všechny knihovny a jejich zdrojové soubory v dev balíčcích.

Bude-li nějaký nestandardní balíček pro překlad potřeba, tak se to včas dozvíte. Balíky s potřebnými soubory se bohužel mohou jmenovat v různých linuxových distribucích různě.

Některé programy pro překlad potřebují navíc zdrojové kódy běžícího jádra (v adresáři /usr/include/linux nebo tak někde – záleží na linuxové distribuci). Můžete se s tím setkat při překladu některých programů, ale v tomto kurzu to snad nebude potřeba.

První překlad

Teď se pokuste přeložit následující dva zdrojové kódy (první v jazyce C, druhý v jazyce C++) pomocí programů gcc a g++ (nebo clang a clang++). Tyto programy máte určitě ve své distribuci, ale není jisté, že jsou již nainstalovány. Pokud ne, podívejte se po nějakém meta balíčku na vývoj v jazycích C/C++.

U 64 bitových distribucí můžete narazit na balíčky gcc (64-bitový kompiler) a gcc-32bit (32-bitový kompiler). Nebojte se používat ten novější, 64-bitový. Ten 32-bitový je tu kvůli kompatibilitě - občas chcete aby váš program fungoval s něčím 32-bitovým, co jste stáhli z internetu už přeložené a nemáte k dispozici 64-bitovou variantu …
/*------------------------------------------------*/
/* 02prekladace/hello.c                           */

#include <stdio.h>

int main(void)
{
    printf("Hello World\n");
    return 0;
}
/*------------------------------------------------*/
/*------------------------------------------------*/
/* 02prekladace/hello.cpp                         */

#include <iostream>

int main(void)
{
    std::cout << "Hello World" << std::endl;
    return 0;
}

/*------------------------------------------------*/

První otázka zní, jaký editor použít na vytvoření zdrojového kódu. Odpověď je jednoduchá - textový. Nejznámější (a nejlepší) linuxové editory jsou vim a emacs. Oba umí barevně zvýraznit syntaxi jazyka C (emacs od verze 21), což vám velice usnadní orientaci ve zdrojovém kódu. Vyzkoušejte si je a ten, co se vám bude zamlouvat více, se pořádně naučte.

Předpokládám, že pracujete v příkazové řádce. Vytvořte soubory hello.c a hello.cpp v aktuálním adresáři.

Zdrojový kód hello.c je napsán v jazyce C a tak se k jeho překladu použije překladač gcc, pro překlad hello.cpp, který je v jazyce C++ překladač g++.

$ gcc -o hello hello.c
$ g++ -o hellocpp hello.cpp
$ ls
hello.c hello.cpp hello hellocpp

Za volbou -o následuje název vytvářeného programu. V Unixech se programy neoznačují příponami (jako .EXE ve Windows), ale mají v souborovém systému nastavený příznak spustitelnosti execute. Ten je automaticky po překladu nastaven. Další argument je název souboru se zdrojovým kódem. Přípony .c (resp. .cpp) jsou překladačem vyžadovány.

Pokud na volbu -o zapomenete, vytvoří se program s názvem a.out.

Pokud by existoval nějaký soubor se stejným jménem, které je uvedeno za volbou -o, byl by bez varování přepsán.

Všiměte si, že soubor hello.c přeložíte programem gcc i g++, ale hello.cpp přeložíte pouze programem g++. Pokud budete trvat na překladu pomocí gcc, zkuste toto:

$ gcc -o hello2 -x c++ hello.cpp -lstdc++

Volba -x určuje, jaký programovací jazyk byl použit v souborech, které jsou vyjmenované za touto volbou. V tomto příkladu ani není potřeba, protože gcc to pozná podle přípony cpp. K programu však musíte připojit standardní knihovnu c++, stdc++. K tomu slouží volba -lstdc++.

Používání g++ je samozřejmě jednodušší. V některých systémech je dokonce gcc i g++ pouze symlink na jeden program, který, podle toho, kterým symlinkem ho zavoláte, přilinkuje ty správné knihovny. Takže asi tak.

Protože jsou vytvořené programy v aktuálním adresáři, spustí se zadáním jeho názvu s tečkou, která reprezentuje aktuální adresář:

$ ./hello1
Hello World

Pokud jste se dostali úspěšně až sem, gratuluji, umíte programovat v Linuxu.

Vývojová prostředí

Ačkoliv budu v tomto kurzu nadále pracovat pouze v příkazové řádce, nemohu zamlčet, že pro Linux existují grafická vývojová prostředí, která vám pomáhají s vývojem rozsáhlejších projektů. Pro začátek si můžete prostudovat stránku o vývojových prostředích. Dočtete se tam o Code::Blocks, NetBeans a dalších.

Většina z těchto rozhraní jsou „jen“ grafickou nadstavbou nad překladači gcc, g++ a dalšími pomocnými programi.

Anjuta

Pokud jste tvrdošíjní zastánci grafického rozhraní, doporučuji vám podívat se po programu anjuta. Anjuta umí, mimo jiné, vytvářet celé projekty, zvýrazňovat barevně syntaxi, sdružovat těla funkcí, při psaní interaktivně ukazuje požadované argumenty funkcí a mnoho dalšího. Je hodně rychlá a nenáročná, je v češtině a snadno se používá.

Problém může být v tom, že zde nebudu popisovat použití tohoto programu. A vzhledem k tomu, že budu probírat „složitější“ operace, jako překládání knihoven programu, různé argumenty překladače atp., bude pro vás mnohem snazší zkoušet si všechno v příkazové řádce, než přenastavovat volby v grafickém rozhraní. Grafické rozhraní se hodí na větší projekty, kde vám pomáhá vývojové prostředí udržet pořádek ve zdrojových souborech, ale na velké projekty se v tomto kurzu nedostane.

Anjuta navíc trpí určitými „dětskými problémy“. Například po vytvoření nového projektu a zkompilování programu se program nechtěl spustit. Musel jsem v nastavení pod menu "Spustit" přenastavit cestu k programu do Debug složky, kam se program kompiloval …

[anjuta]

Anjuta

Chybu jistě neuděláte s NetBeans, nebo, ještě lépe, s Code::Blocks (ty ale nebývají součástí distribuce). Více viz vývojová prostředí.

Skript colorgcc

Možná by pro vás bylo dobré, kdybyste se podívali po balíčku colorgcc (býval součástí Debianu). Jedná se o skript v jazyce Perl, které spouští překladač gcc/g++ a jeho výstup „obarví“ (standardně je všechen výstup z překladače na příkazové řádce bez barvy. Skript colorgcc obarví chybové hlášení červeně atd.)

Po jeho instalaci můžete místo příkazu gcc používat colorgcc, nebo ještě lépe, vytvořit symbolický odkaz gcc na colorgcc do některého adresáře, který je v cestě PATH uveden dříve než adresář, ve kterém je překladač gcc.

$ ls /usr/bin/colorgcc
/usr/bin/colorgcc
$ ls /usr/bin/gcc
/usr/bin/gcc
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/rimmer/bin
# ln -s /usr/bin/colorgcc /usr/local/bin/gcc

Pokud toto nefunguje, můžete ještě zkusit vytvořit aliasy. Řekněme, že jste uložili skript colorgcc.pl do adresáře ~/bin/.

$ chmod +x ~/bin/colorgcc.pl
$ alias gcc=~/bin/colorgcc.pl
$ alias g++=~/bin/colorgcc.pl

Aliasy samozřejmě můžete zapsat do svého ~/.alias nebo ~/.bashrc souboru.

Zkuste si odstranit středník z příkladu hello.c (nebo helloc.cpp) a přeložit jej pomocí colorgcc …

A nebo se na colorgcc vykašlete a používejte clang a clang++ :-). Ti vypisují chybové hlášky barevně sami od sebe.

A to je prozatím vše. V další kapitole popíši některé důležité volby (argumenty příkazové řádky) překladače gcc (i clang, protože má stejné volby).

Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 14.11.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..