Search
Na cvičení budeme vycházet z následujícího programu v C, který budeme dále modifikovat.
Program pro zobrazování reprezentace čísel v paměti:
/* Simple program to examine how are different data types encoded in memory */ #include <stdio.h> /* * The macro determines size of given variable and then * prints individual bytes of the value representation */ #define PRINT_MEM(a) print_mem((unsigned char*)&(a), sizeof(a)) void print_mem(unsigned char *ptr, int size) { int i; printf("address = 0x%016lx\n", (long unsigned int)ptr); for (i = 0; i < size; i++) { printf("0x%02x ", *(ptr+i)); // == printf("0x%02x ", ptr[i]); } printf("\n"); } int main() { /* try for more types: long, float, double, pointer */ unsigned int unsig = 5; int sig = -5; /* Read GNU C Library manual for conversion syntax for other types */ /* https://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html */ printf("value = %d\n", unsig); PRINT_MEM(unsig); printf("\nvalue = %d\n", sig); PRINT_MEM(sig); return 0; }
/opt/apo/binrep/print_binrep
gcc -Wall -pedantic -o print_binrep ./print_binrep.c
Makefile
V situaci, kdy máme jeden zdrojový soubor není problém spouštět překladač pokaždé ručně. U větších projektů ale máme souborů víc a často různých typů – máme třeba zdrojové kódy v C a v assembleru, dokumentaci v XML a třeba i něco dalšího. Překládat ručně každý soubor zvlášť a ještě k tomu jiným překladačem a spojovat výsledek dohromady je zbytečně velká práce. Proto byl vymyšlen program make. Jeho základní myšlenka je ta, že se popíše jak se překládá který typ souboru a stanoví se které soubory jsou potřeba pro “vyrobení” jiného souboru.
Program make funguje tak, že po spuštění si přečte soubor Makefile, kde jsou zapsána pravidla pro kompilaci a vyvolává postupně překladače tak, jak je potřeba.
V souboru Makefile existují čtyři typy řádek:
Nejjednodušší Makefile pro kompilaci programu hello vypadá následovně.
hello: hello.c
Obsahuje pouze jednu řádku s popisem závislostí. Takto zapsaná řádka říká, že pro vytvoření souboru hello je potřeba soubor hello.c. Tomu, co je vlevo od dvojtečky se říká target (cíl) a vše co je napravo jsou takzvané prerekvizity.
hello.c
Program make má v sobě vestavěna implicitní pravidla, díky nimž ví, jak má provést překlad. Kdyby tato pravidla neexistovala, musel by náš Makefile vypadat takto:
hello: hello.c gcc -Wall -o hello hello.c
Na druhé řádce, která začíná tabulátorem, je příkaz, který bude vykonán pokud make usoudí, že je potřeba překompilovat soubor hello.
hello
Implicitní pravidla říkají, jak z jednoho typu souboru vyrobit jiný typ souboru. Tato pravidla jsou většinou definována pomocí proměnných. Chceme-li implicitní pravidlo jen trochu pozměnit, nemusíme ho definovat znova, ale stačí změnit jen hodnoty proměnných, které se v pravidlech používají.
CFLAGS = -g -Wall CC = m68k-elf-gcc hello: hello.c
Pomocí proměnné CFLAGS se například určuje, s jakými přepínači má být spouštěn překladač jazyka C. Jak se jmenuje překladač se zase specifikuje v proměnné CC[3].
CFLAGS
CC
Pokud chceme překládat větší projekt, bývá zvykem rozšířit Makefile o další targety:
all: hello clean: rm -f hello hello: hello.c gcc -Wall -g -o hello hello.c
O programu make by toho šlo napsat mnohem víc. Jdou pomocí něj překládat i velmi komplikované projekty jako například samotné jádro Linuxu. Vetšinou není potřeba vytvářet složité soubory Makefile ručně. Nástroje jako Meson, CMake, autoconf či nějaké IDE Makefile generují automaticky.
Pokračování prvního cvičení.
7+6, 7-6
7*6
-7*6, -7*(-6), 7*(-6)
42/7, 43/7
Nové úkoly tohoto cvičení.
char, float, long, int*
-16
15
float - 32bit, double - 64bit
-0.75
0xC0A00000
9.999*10^1 + 1.1610*10^(-1)
0.5
-0.4375
1.110*10^10 * 9.200*10^(-5)