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