Informace Fórum Stav sítě ČVUT IDS Hledání Přihlášení Mapa stránek

Kompilace a sestavování programu

Následující text je určen zejména těm uživatelům, kteří nejsou ještě důvěrně seznámeni se sytémem AIX (Unix).

Kompilace a sestavování programu je v operačních systémech typu Unix podobná, liší se jen v detailech (nastavení optimalizačních parametrů, použití knihoven apod.).

V Unixu existují 2 základní metody:

Interaktivní metoda

Interaktivní metoda se používá při vývoji jednoduchých programů (jedno nebo několika málo modulových). Aby se vytvořil program, který bude moci být později spuštěn, např. program hello.f. (v jazyku Fortran) použijeme:

xlf hello.f

Jestiže bude program přeložen bez chyb, kompilátor na konci procesu zpracovánívytvoří program nazvaný a.out. Tento program pak uživatel může spustit. Podobně při práci s jazykem C, se použije příkaz:

xlc hello.c

Jestliže se program má skládat z více modulů, pak je nutné příkaz doplnit o seznam všech modulů. Na prvním místě by měl být modul, který obsahuje hlavní program. Výsledkem bude opět a.out. Např.:

xlf main.f mod1.f mod2.f

Pokud uživatel chce, aby se výsledný program jmenoval jinak než a.out, pak musí použít parametr (-o ), za kterým definuje jeho jméno:

xlf -o hello hello.f

Někdy nastane situace, kdy uživatel chce své zdrojové programy pouze kompilovat (např. když z nich bude zakládat knihovnu). Toho dosáhne tím, že použije parametr (-c); potlačí tím fázi sestavování. Výsledkem bude vytvoření modulu se shodným jménem, ale s příponou .o, modul se pak může použít v dalších krocích zpracování.


	xlf -c funct.f

	xlf -o muj main.f funct.o

To, co bylo až dosud popisováno, platilo obecně; pokud se podíváme na některé vybrané platformy, příkazy se v detailech liší. Např. pro AIX se mimo ,,xlf" používá i f77 a cc pro jazyk C. Nejvíce rozdílu je ve volitelných parametrech, které určují specifické podmínky překladu nebo sestavení programu a podmínky optimalizací.

Nejpoužívanější parametry (flagy) jsou označeny písmeny c, o, g, O, l, L, I. Jejich použití již bylo částečně demonstrováno v předchozích příkladech. Je potěšitelné, že ve všech typech Unixu jsou použity stejně:

-c
říká, že se má realizovat pouze překlad, fáze sestavení programu je potlačena; soubor, který po překladu vznikne, má stejné jméno jako původní zdrojový program, ale jeho přípona se změní na .o
-o
definuje změnu jména výstupního programu
-g
říká, že se do vytvářeného programu mají doplnit informace pro ladění (debugging) pomocí ladících programů typu db
-Ox
říká, že se má realizovat optimalizace ve zvolené úrovni (2,3 nebo 4) (Jak se dá asi odhadnout, v tomto parametru může existovat mnoho zdrojů nekonzistencí, pokud se program pouští na různých platformách)
-L
definuje, které další adresáře se mají prohlédnout, aby se do programu začlenila příslušná knihovna, standardně se prohlíží jen adresář /usr/lib, kde jsou uloženy všechny standardní knihovny.
-l
definuje jméno knihovny, odkud se má do programu připojit knihovní modul
-I
Nestandardní (uživatelské) knihovní moduly obvykle vyžadují, aby k nim byl definován i uživatelský interface (příslušná metoda volání, nebo v terminologii jazyka C, příslušné *.h soubory). Tento parametr určuje adresář, kde bude překladač takové moduly hledat, standardně prohledává jen adresář /usr/include

Vzhledem k tomu, že jsme se zde zmínili o knihovnách, aniž jsme o nich předtím hovořili, uvedeme zde několik slov, které jejich roli v Unixu osvětlí.

Knihovny jsou v Unixu, stejně jako v ostatních operačních systémech, prostředkem pro efektivnější práci s programovými jednotkami (podprogramy, funkcemi, atd.), které se často používají. Základní knihovny operačního systému byly vytvořeny programem ar a obsahují stovky přeložených modulů. Do jednotlivých knihovem byly ukládány podle příbuznosti funkcí,existuje tak knihovna pro základní I/O funkce, knihovna pro základní matematické funkce, knihovna pro práci s grafikou a mnoho dalších.

Při vytváření knihoven se obecně používá následující konvence: jména knihoven vždy začínají lib a končí příponou .a. Např. knihovna pro základní matematické funkce má jmeno libm.a a je uložena v adresáři /usr/lib. Pokud ji chce uživatel použít ve svém programu, pak ji musí uvést i v příkazu pro kompilaci a sestavení. Je několik způsobů, jak to provést, ten nejjednodušší je ten, že se použije parametr -l. (Cesta je v tomto případě standardní, takže se nemusí používat žádný parametr -L a tím se ze jména automaticky odsekává standardní předpona i přípona. Výsledkem je parametr doplněný na -lm).

Pokud by chtěl uživatel použít nějakou jinou knihovnu, např. z knihovny podprogramů, které provádí nějaké speciální funkce, pak by musel uvést i cestu(y), kde tato knihovna(y) existuje, např.


	xlf -o muj_program muj_program.f moje_funkce.f \

	-L /usr/local/demolib -lxy \

	-L /vol/appl_spe101/GNU/lib -lgrafX

Znak \ prodlužuje příkazovou řádku a úplná jména knihoven jsou v tomto případě libxy.a a libgrafX.a.

Pozn.: Jinou cestou, jak zařadit knihovní moduly do programu, je uvedení knihovny, která obsahuje potřebné moduly (s úplnou cestou) do seznamu modulů, které se překládají, např.

f77 -o muj_program muj_program.f moje_funkce.f
/vol/appl_spe101/freeware/lib/packlib.a

Uživatel si může vytvářet své vlastní knihovny pomocí programu ar, který je jedním ze základních příkazů každého Unixu. Jeho syntax je následující:

ar keys library_name [list of obj. files]

Význam je zřejmý. V praxi se nejčastěji používají dva klíče (parametry), které říkají, co se má s knihovnou provádět:

r
pro nahrazení nebo vložení nového modulu
t
pro zobrazení obsahu knihovny

Následující příklad demonstruje vytvoření knihovny libmyC, do které budou vloženy funkce fun1, fun2 a fun3, které se nejprve přeloží.


	 cc -c fun1.c

	 cc -c fun2.c

	 cc -c fun3.c

	 ar r libmyC.a fun1.o fun2.o fun3.o

Metoda používající příkaz "make"

Tato metoda se používá většinou při kompilaci a sestavování složitějších programů. Uživatel používá stejných příkazů, jako při interaktivní práci, ale má je předem zapsány v souboru.

Příkaz make pracuje automaticky (pokud se neuvede jinak) se souboremMakefile umístěným v adresáři společně se zdrojovým textem. Příkaz make má mnoho možností, a proto ho zde nebudeme popisovat. Syntax a jeho možnosti je možné získat standardním způsobem (man make).

Příklad pro Makefile pro kompilaci několikamodulového programu, který pracuje s knihovnami X11 je v následujících řádcích:

 


---- obsah souboru  Makefile ----

CC = cc

HOME= /users/jiri

SRCDIR = $(HOME)/notif/beam/beam

MY_INCLUDES = -I$(HOME)/include -I$(SRCDIR)

XSLIBDIR = /users/jiri/young/lib

LDFLAGS= -L /usr/lib/X11R4 -L /usr/lib/Motif1.1

INCLUDES= -I/usr/include/X11R4 -I/usr/include/Motif1.1

	  $(LDFLAGS)

	  DEBUG = -DSYSV -D_NO_PROTO

	  #DEBUG = -Aa -D_HPUX_SOURCE

	  # HP Machines

	  CFLAGS = $(DEBUG) $(MY_INCLUDES) $(INCLUDES) -I$(XSLIBDIR)

	  # DEC and Sun

	  #CFLAGS = $(DEBUG) -I$(XSLIBDIR)

	  

	  LIBS = $(XSLIBDIR)/libXs.a -lM -lXm -lXt -lX11

	  

	  .o:.c

	  all:    bkoule

	  

	  # This variable lists the object files generated.

	  

	  OBJS=   Main.o\

	  crMenuF.o\

	  MenuCB.o\

	  Dialogs.o\

	  rtel13.o\

	  gener.o\

	  rotpl1.o\

	  rot3d.o\

	  vidit2.o



# This variable lists the C source files required.

#       xyz.c

SOURCES=Main.c\

	MenuCB.c\

	crMenuF.c\

	Dialogs.c\

	rtel13.c\

	gener.c\

	rot3d.c\

	rotpl1.c\

	vidit2.c



bkoule: $(OBJS)

	$(CC) $(CFLAGS) -o $(HOME)/bin/$@ $(OBJS)$(LIBS)



#----konec souboru Makefile----

Kompilátory