Hlavní navigace

Programování pod Linuxem pro všechny

23. 1. 2004
Doba čtení: 5 minut

Sdílet

Na ROOTu se nachází mnoho článků zabývajících se programováním, ale většina se zabývá jen určitým problémem a nevšiml jsem si článku, který by byl pro lidi, kteří přešli na Linux včera a chtějí se naučit nějaké "fígle". Rozhodl jsem se tedy napsat sérii takovýchto článků sám. Měla by vás naučit psát programy, které budou funkční a budou opravdu "něco dělat". Předpokládám, že máte nějaké zkušenosti s C. Tak se pusťme do prvního dílu.

Editace zdrojových souborů

První věcí, kterou bychom se měli naučit, je překládání zdrojových souborů. Než však přeložíme první program, řekneme si něco o editačním programu Emacs. Samozřejmě, že nikoho nenutím, aby používal právě Emacs, ale poklám ho za velice zdařilý program k editaci veškerého textu.

Otevření souboru se zdrojovým kódem

Editor Emacs můžete spustit, jak z terminálového okna příkazem emacs, tak kliknutím na příslušnou nabídku/ikonu v X-Windows. Kliknutím na nabídku File-Open File… se v dolní části zobrazí kurzor a vy můžete napsat cestu k souboru. Pokud máte spuštěn Emacs v terminálu, zpřístupníte nabídku klávesou F10.

Automatické formátování textu a zvýraznění syntaxe

Emacs umožňuje automatické formátování textu, co to znamená? Pokud napíšete nějaký příkaz, „odenterujete“ a stisknete TAB, Emacs správně odsadí od kraje. To je velice výhodné, protože kód je přehledný a navíc máte kontrolu, že jste neudělali chybu.

Další věcí, která velice zpřehledňuje kód, je zvýraznění syntaxe. Jde o to, že text bude barevně rozdělen, například klíčová slova mohou být zobrazena jednou barvou, předdefinované typy jinou a komentáře mohou mít opět jinou barvu. Pokud chcete zvýraznění syntaxe zapnout, vytvořte soubor .emacs ve vašem domovském adresáři a zapište do něj:

(global-font-lock-mode t)

Uložte soubor, ukončete editor a znovu jej spusťte. A nyní se můžete kochat barvami.

Překlad zdrojového souboru pomocí GCC

Překladač je program, který překládá zdrojový kód na kód, jemuž počítač „rozumí“ a „umí“ jej spustit. V Linuxu se nejčastěji používá překladač GCC, který umí překládat zdrojové kódy jazyků C, C++, Java, Objective-C, Fortran… Nyní si předvedeme na ukázkovém programu různé volby překladače.

Hello.c:

#include <stdio.h>

main()
{
     printf("Hello world");
}

Myslím, že tento program zná každý :-)

Pro překlad programu zadejte gcc main.c. Pokud jste v programu neudělali žádný překlep, objeví se v adresáři soubor a.out, což je spustitelný program, který můžete libovolně přejmenovat. Jestliže se v průběhu kompilace objevil nějaký výpis, pozorně si jej přečtěte, protože obsahuje důležité informace (nejčastěji chyby, které jste udělali). Že umíte přeložit program, je sice moc hezké, ale kdo by se pořád přepisoval s názvem. Zkuste spustit kompilaci s přepínačem -o a názvem souboru: gcc -o main main.c. A co se nestalo, místo programu a.out je na jeho místě program main.

Co když se však bude program skládat z více souborů(nemyslím soubory .h, ale soubory .c)? V tomto případě nám pomůže přepínač -c. Pomocí něj se nevytvoří spustitelný soubor, ale přemístitelný soubor, tj. soubor, který sice obsahuje část programu, ale není ještě „slinkovaný“. Spuštěním příkazu gcc -c main.c vznikne soubor main.o. A pokud bychom měli další část programu také jako přemístitelný soubor, můžeme je spojit příkazem gcc -o main main.o soubor.o.

Při použití hlavičkových souborů GCC prohledává adresáře se systémovými hlavičkovými soubory (většinou /usr/include,

/usr/local/include a jiné). Pokud si vytvoříte vlastní hlavičkové soubory, nemusíte je kopírovat do /usr/include, ale stačí uvést přepínač -I při překladu. Volba -I říká překladači, v jakém adresáři má hledat hlavičkové soubory. Např. gcc -I ./include main.c.

V některých případech budete chtít zadat z příkazového řádku makro. Umožní to volba -D. Například budete chtít zapnout ladící volby programu: gcc -c -D DEBUG main.c či gcc -c -D DEBUG=2 main.c.

Až budete překládat finální verzi programu, pravděpodobně budete chtít, aby „běžel“ co nejrychleji. Pro tento případ zadejte na příkazový řádek volbu optimalizace -O2 (GCC má několik úrovní optimalizace, viz man gcc): gcc -c -O2 main.c.

Pokud používáte funkce, které nejsou ve standardní knihovně C, budete muset použít volbu -l. Všechny knihovny mají v názvu předponu lib. Pokud je přidáte do svého překladu, nemusíte tuto předponu vpisovat, překladač to udělá za vás. Stejně tak nemusíte psát přípony pro knihovny (.a, .so). Např. gcc -c main.c -lm, přidá do vašeho programu funkce z matematické knihovny. Stejně jako u hlavičkových souborů i u knihoven se prohledávají určité adresáře(/lib a /usr/lib). Pokud má překladač vyhledávat v jiných adresářích, uveďte je za volbou -L. Pokud máte své knihovny v adresáři, odkud spouštíte kompilaci, musíte uvést volbu -L., protože GCC neprohledává aktuální adresář.

Automatický překlad pomocí GNU Make

Budete-li překládat nějaký větší program, pravděpodobně nebudete překládat každý zdrojový soubor do přenositelného kódu a posléze je spojovat a kopírovat do určeného adresáře ručně. Pro tento účel byl vytvořen GNU Make. Základní idea programu Make je jednoduchá, programu je třeba říci, jaký cíl (target) se má sestavit a jaká pravidla (rules) pro jeho sestavení platí. Také je nutné specifikovat tzv. závislosti (dependencies), jež indikují, za jakých podmínek se má konkrétní cíl sestavit.

Pokud budeme mít program o dvou souborech program.c a výpočty.c, budou tři cíle: program.o, výpočty.oa program(.exe;)). Když si uvědomíte, jaké příkazy jste použili ke kompilaci kódu, bude vám jasné, jaká pravidla máte použít. Specifikace závislostí je poněkud komplikovanější, je zřejmé, že program závisí na program.c a výpočty.c. Dále je důležité, že program.o a výpočty.o je nutné vytvořit pokaždé, když se změní příslušný soubor. Zpravidla se také specifikuje cíl zvaný clean, jenž má za úkol odstranit generované přemístitelné kódy a samotné sestavené programy, aby bylo možné sestavovat vše od začátku. Cíle, pravidla a závislosti se definují v souboru Makefile.

Ukázkový soubor Makefile:

program: program.o výpočty.o
     gcc $(CFLAGS) -o program program.o výpočty.o
program.o: program.c
     gcc $(CFLAGS) -c program.c
výpočty.o: výpočty.c
     gcc $(CFLAGS) -c výpočty.c

clean:
     rm -f *.o program

Proměnná CFLAGS slouží k dodatečnému předávání parametů překladači, např. make GFLAGS=-g. Nyní můžete zadat v shellu:

# make

a na obrazovce uvidíte tento výstup:

# make
gcc -c program.c
gcc -c výpočty.c
gcc -o program program.o výpočty.o

Pokud nyní změníte nějaký výše uvedený soubor, make bude překládat jen soubory, které přímo závisejí na tomto souboru. Např. pokud změníte soubor výpočty.c, bude výstup make vypadat takto:

CS24_early

# make
gcc -c výpočty.c
gcc -o program program.o výpočty.o

# make clean
rm -f *.o program

Ještě bych chtěl upozornit, že pravidla se musí oddělit od začátku řádku tabulátorem.

V příštím dílu budeme už konečně programovat. Ukážeme s,i jak používat funkci getopt_long, řekneme si něco o systémových a uživatelských proměnných, vytváření dočasných souborů a bezpečném programování.

Byl pro vás článek přínosný?

Autor článku