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++.
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 …
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++.
$ 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:
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ář:
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 …
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
.
/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/
.
$ 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).