Projekt v rámci SIPVZ:

Transkript

Projekt v rámci SIPVZ:
Identifikační údaje školy
Číslo projektu
Název projektu
Číslo a název šablony
Autor
Tematická oblast
Číslo a název materiálu
Anotace
Vytvořeno
Určeno pro
Přílohy
Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková
organizace
Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874
www.vosassvdf.cz, tel. +420412372632
CZ.1.07/1.5.00/34.1076
Pro vzdělanější Šluknovsko
32 - Inovace a zkvalitnění výuky prostřednictvím ICT
0202 Ing. Vladimír Ďurči
LINUX
VY_32_INOVACE_0202_0304
Jak vytvořit program v Linuxu?
Makefile [3/4]
JAZYK „C“ - OS LINUX
26. 8. 2013
Operační systémy 4. ročník, maturitní obor
Přiložené textové soubory, a zpracované programy
IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO
VÝUKY INFORMAČNÍCH TECHNOLOGIÍ
JAZYK C
Lekce 4
Jak vytvořit program v Linuxu?
Makefile
Obsah lekce:
Cíle ...................................................................................................................................... 1
Program pro dnešní lekci ................................................................................................. 2
Makefile pro větší projekty………………………………………………………………3
Otázky k opakování………………………………………………………………………4
Lab…………………………………………………………………………………………5
Cíle
Tato lekce je velmi stručným úvodem do vytváření souboru.
Program pro dnešní lekci
Příklad pro dnešní lekci
Konkrétní program si můžete stáhnout zabalený jako c17.tar.gz.
#
# Makefile pro pokusný příklad 16. a 17. dílu seriálu o C/C++ na linuxsoft.cz
#
# Jméno přeloženého programu
program=priklad
# Seznam objektových souborů použijeme na dvou místech.
OBJ=funkce.o main.o
# Míra optimalizace překladače gcc
OPT=-O2
# Cílům build, install, uninstall, clean a distrib neodpovídá přímo žádný soubor
.PHONY:
.PHONY:
.PHONY:
.PHONY:
.PHONY:
build
install
uninstall
clean
distrib
# První cíl je implicitní, není třeba volat 'make build', stačí 'make'.
# Cíl build nemá žádnou akci, jen závislost.
build: ${program}
# install závisí na přeložení projektu, volat ho může jen root
install: build
cp ${program} /usr/bin
# uninstall má jenom akci a žádnou závislost, volat ho může jen root
uninstall:
rm -f /usr/bin/${program}
# clean smaže soubory po překladu
clean:
rm -f *.o ${program}
# distrib vytvoří balíček s kompletním zdrojovým kódem
# akce na dva řádky se napíše pomocí zpětného lomítka
distrib:
tar -c funkce.c main.c funkce.h Makefile > c17.tar; \
gzip c17.tar
${program}: ${OBJ}
3
gcc ${OBJ} -o ${program} ${OPT}
funkce.o: funkce.c
gcc funkce.c -c ${OPT}
main.o: main.c funkce.h
gcc main.c -c ${OPT}
# Závislost všech objektových souborů na všech hlavičkových
${OBJ}: ${HEAD}
# A to je vše, pravidla pro main.o a funkce.o není třeba uvádět
Celý příklad si můžete stáhnout zabalený jako c18.tar.gz. Všimněte si, že přidání nového
zdrojového souboru do projektu spočívá v modifikaci proměnných OBJ a SRC nebo HEAD, jde
tedy jen o malou změnu Makefile na jednom místě. U našeho projektu ze tří zdrojových souborů to
není důležité, ale již v případě středně velkých projektů je tato vlastnost téměř nutností.
Je třeba říci, že organizace překladu projektů C na Unixu není ustálená, používá se více způsobů
překladu od sestavovacích skriptů přes ručně psaný Makefile až po generování Makefile z nějaké
jednodušší šablony. Za standardní byť poněkud kontroverzní řešení se považuje postupné
generování (velmi složitého a pro člověka téměř nečitelného) Makefile z jednoduchého
Makefile.am a configure.in pomocí automaku a autoconfu a jimi vygenerovaného shellového
skriptu configure, ale popis těchto komplikovaných nástrojů by značně přesáhl cíle tohoto seriálu a
částečně i autorovy znalosti.
Rychlokurs gdb
Minule jsem zmínil parametr -g překladače gcc, který zajistí přidání ladících informací do kódu.
V našem Makefile stačí nastavit OPT=-g a celý projekt znovu přeložit.
make clean
make
Standardním nástrojem pro ladění programů napsaných v C na Linuxu je řádkový debugger gdb.
Používá se buď přímo, nebo prostřednictvím nějaké nadstavby typu ddd, xxgdb nebo KDbg.
Krokování programů v prostředích jako je KDevelop a emacs je ve skutečnosti také
implementováno pomocí gdb. My si ukážeme krokování laděného programu přímo v gdb.
#include <stdio.h>
#include <stdlib.h>
int nadruhou(int n) {
int i, suma;
for (i = 0; i <= n; i++) {
suma += n;
}
return suma;
}
int main(int argc, char **argv) {
int n;
if (argc < 2) {
puts("syntaxe: nadruhou číslo");
return 1;
4
}
n = atoi(argv[1]);
n = nadruhou(n);
printf("%i\n", n);
return 0;
}
Uvedený program má zkonvertovat svůj první parametr na celé číslo a na standardní výstup vypsat
jeho druhou mocninu. Aby to nebylo tak jednoduché, máme zadavatelem zakázáno v programu
násobit, takže druhou mocninu musíme vypočítat přičítáním v cyklu. Do programu se nám ovšem
vloudila chyba.
$ gcc nadruhou.c -g -o nadruhou
$ ./nadruhou 1
2
$
Jedna na druhou jistě není 2, takže musíme program ladit.
$ gdb nadruhou
(gdb)
Zadáme parametry programu, nastavíme breakpoint na začátek funkce main a spustíme program.
(gdb) set args 1
(gdb) break main
Breakpoint 1 at 0x80483e2: file nadruhou.c, line 17.
(gdb) run
Program se spustí, ale hned na začátku main se díky breakpointu zastaví. K základním příkazům
gdb patří









break funkce
Vlož breakpoint na začátek funkce.
break soubor:řádek
Vlož breakpoint na příslušné místo.
delete
Smaž breakpoint určený parametrem nebo všechny breakpointy.
continue
Pokračuj k dalšímu breakpointu nebo do konce programu.
next
Krok bez zanoření do volané funkce.
step
Krok se zanořením do volané funkce.
list
Výpis kódu programu v okolí aktuální pozice.
print výraz
Výpis hodnoty výrazu.
help
Nápověda, může mít jako parametr příkaz nebo skupinu příkazů.
Podobně jako například v bashi můžeme pomocí šipek nahoru a dolů listovat minulými příkazy,
funguje hledání pomocí Ctrl+r, enter znamená opakování předchozího příkazu atd.
5
Po dvou next můžeme zadat například print argv[1] a print n, čímž zjistíme, že k chybě dojde až ve
funkci nadruhou. Příkazem step se dostaneme dovnitř funkce a zjištění, že for cyklus běží o jednu
iteraci déle, než by měl, je už záležitostí několika příkazů next a print.
Ukázali jsme si jen základy gdb, zájemce o hlubší znalosti odkazuji na manuálové stránky a návody
a články na webu. Určitě stojí za to vyzkoušet některou z grafických nadstaveb gdb. Z vlastní praxe
vím, že gdb se hodí především pro ladění menších projektů a často se nedá rozumně použít při
vývoji programů využívajících vlákna. V těchto případech je obvykle vhodné umožnit oddělení
kritické části programu (například složitý algoritmus) odladit ji samostatně. Po
6
Otázky k opakování
_____________________________________
1.
Uveďte dva způsoby, jimiž je možno zadat preprocesoru, že součástí programu má být
hlavičkový soubor /usr/include/math.h. Nechť je hlavičkový soubor declar.h umístěn
v podadresáři domovského adresáře hearders. Uveďte dva způsoby, jak sdělit preprocesoru, že
tento hlavičkový soubor má být součástí programu?
7
Lab
_________
.
8