Mikroraunarski sistemi za rad u realnom vremenu GCC
- Slides: 37
Mikroračunarski sistemi za rad u realnom vremenu „GCC i make“
GCC Originalni GNU C Compiler (GCC) je razvijen od strane Ričarda Stolmana (Richard Stallman), osnivača GNU projekta i pored Linusa Torvaldsa, začetnikom Linux operativnog sistema 1984 godine GNU projekat je kreiran kako bi omogućio Unix-like operativni sistem kao free software, u cilju promovisanja slobode programiranja Vremenom je GCC obuhvatio podršku za druge programske jezike (C++, Objective-C, Java, Fortrana, Ada) tako da GCC danas znači GNU Compiler Collection
GNU Toolchain sadrži: GCC kompajler (osnovna komponenta) GNU Make (automatizovan alat za kompajliranje i build -ovanje aplikacija GNU Binutils (binarni alati uključujući linker i asembler) GNU Debugger (GDB) GNU Autotools GNU Bison
GCC je portabilan i može se izvršavati na mnogim operativnim sistemima Predstavlja prirodno okruženje za Linux i Unix-like OS Na Windows operativnim sistemima Min. GW i Cygwin Takođe, postoji i cross-kompajler koji omogućava pravljenje izvršnih fajlova za različite platforme (između ostalog ARM)
GCC i G++ GCC je kompajler za C, dok se kompajler za C++ naziva G++ Primer: //hello. c #include <stdio. h> int main() { printf("Hello, world!n"); return 0; } > gcc hello. c >. /a. out
GCC Ukoliko želimo da menjamo ime izlaznog fajla: > gcc -o hello. c >. /hello > Hello, World! U Linux-u se izvršni fajl uvek pokreće sa. /ime_binarnog_fajla Ovo praktično znači: pozovi fajl sa nazivom ime_binarnog_fajla iz trenutnog direktorijuma Moguće je pokrenuti program samo sam ime_binarnog_fajla samo ukoliko se putanja fajla nalazi u PATH environment varijabli
G++ Primer: //hello. cpp #include <iostream> using namespace std ; int main(){ cout << "Hello, world!” << endl ; return 0; } > g++ -o hellocpp hello. cpp >. /hellocpp
GCC kompajler opcije: gcc -Wall -g -o hello. c -Wall prikazuje SVE warning poruke -g generiše simbole potrebne za debagovanje korišćenjem gdb debagera Moguće je posebno kompajlirati i povezivati izvršni fajl: gcc -c -Wall -g hello. c //kao rezultat se dobija hello. o gcc -g -o hello. o //kao rezultat se dobija hello
GCC Moguće je istovremeno kompajlirati i povezivati više objektnih fajlova: gcc -o myprog file 1. c file 2. c Ili, moguće je i odvojeno najpre kompajlirati izvorne pa tek onda povezivati objektne fajlove gcc -c file 1. c gcc -c file 2. c gcc -o myprog file 1. o file 2. o
GCC proces kompajliranja
GCC proces kompajliranja Pozivanje predprocesora koji dodaje. h fajlove u. c cpp hello. c > hello. i Kompajliranje, rezultat je asembler kod za dati procesor gcc -S hello. i Asembliranje, tj. Konvertovanje asemblerskog koda u mašinski kod u formi objektnog fajla as -o hello. s Povezivanje sa bibliotekama ld -o hello. o . . . libraries. . .
Header fajlovi i biblioteke Biblioteka je kolekcija pred-kompajliranih objektnih fajlova koji mogu da se povezuju sa izvršnim fajlom pomoću linker-a (npr printf(), sqrt()) Postoje dva tipa biblioteka: statičke i deljene Statička biblioteka ima ekstenziju. a (Linux) odnosno. lib (Windows) i prilikom povezivanja sa objektnim fajlom kod iz biblioteke se kopira u izvršni fajl. Ovakav tip biblioteke se može kreirati korišćenjem programa ar. Deljene biblioteke imaju ekstenziju. so (Linux) odnosno. dll (Windows). Kada se program povezuje sa ovakvom bibliotekom, samo mala tebela se kreira u izvršnom fajlu. Pre nego što se krene sa izvršavanjem, operativni sistem učitava mašinski kod zahtevan za eksterne funkcije i ovaj proces je poznat kao dinamičko povezivanje (dynamic linking). Na ovaj način se dobijaju manji izvršni fajlovi i čuva se prostor na disku jer se deljene biblioteke dele između više izvornih fajlova. Osim toga, nadogradnja sistema je moguća bez ponovnog rekompajliranja izvornog koda (samo je potrebno zameniti deljenu biblioteku)
Header fajlovi i biblioteke Prilikom kompajliranja, kompajleru su neophodni header fajlovi Linker-u su potrebne biblioteke da bi razrešio eksterne reference na druge objektne fajlove ili biblioteke Za svaki. h fajl korišćen od strane. c fajlova (korišćenjem #include direktive) kompajler traži include putanju. Ove putanje se specificiraju korišćenjem –Idir opcije ili environment varijable CPATH. Pošto su imena. h fajlova poznata, putanja je dovoljna
Header fajlovi i biblioteke Linker traži tzv. putanju biblioteke za sve biblioteke koje su potrebne kako bi se kreirao izvršni fajl Ova putanja se specificira sa –Ldir opcijom ili environment varijablom LIBRARY_PATH Dodatno, potrebno je tačno navesi i ime biblioteke: Na Unix –like i Linux operativnim sistemima za biblioteku libxxx. a potrebno je navesti –lxxx opciju U Windows operativnom sistemu, navodi se celo ime kao lxxx. lib
GCC environment varijable PATH: u njoj se traže izvršni fajlovi kao i deljene biblioteke (. dll, . so) CPATH: služi za pretraživanje include putanja za header fajlove. Ovaj direktorijum se pretražuje nakon direktorijuma specificiranog sa –Idir opcijom. Dodatno, C_INCLUDE_PATH i CPLUS_INCLUDE_PATH se mogu koristiti da se specificiraju C/C++ header fajlovi ukoliko je programski jezik naznačen tokom predprocesiranja LIBRARY_PATH: U njemu se traže biblioteke, nakon što se pretraže putanje specificirane sa –Ldir opcijom
Dodatni GCC alati “file“ služi za prikaz tipa objektnog ili izvršnog fajla > file hello. o > hello. o: ELF 64 -bit LSB executable, x 86 -64, version 1 (SYSV), dynamically linked (using shared libs), for GNU/Linux 2. 6. 32 “nm” služi za izlistavanje tabele simbola u okviru objektnih fajlova. Obično se koristi da bi se utvrdilo da li je neka funkcija definisana u objektnom fajlu. Slovo T u drugoj koloni označava da je funkcija definisana, dok U označava da nije i da mora biti razrešena od strane linkera: > nm hello. o > 00000000 T main
Dodatni GCC alati “ldd“ proverava izvršni fajl i prilazuje sve deljene biblioteke koje su neophodne > ldd hello > linux-vdso. 1 => (0 x 00007 ffdcad 43000) libc. so. 6=>/lib/x 86_64 -linux-gnu/libc. so. 6 (0 x 00007 fddb 6 b 1 a 000) /lib 64/ld-linux-x 86 -64. so. 2 (0 x 00007 fddb 6 ee 4000)
GNU Make “make” automatizuje složene aspekte kreiranja izvršnog fajla iz izvornog koda Koristi makefile koji sadrži pravila kako se kreiraju izvršni fajlovi – sva pravila samo treba poslagati u makefile, nazvati ga makefile, Makefile ili GNUMakefile i pokrenuti komandu make Postoje knjige napisane o “make”-u, a ovde ćemo samo pomenuti osnovna pravila i elementarno korišćenje Dokumentaciju o “make”-u je moguće dobiti pomoću “make –help” ili pomoću “man make” koji izlistava tzv man pages
Primer Makefile-a all: hello: hello. o gcc -o hello. o: hello. c gcc -c hello. c clean: rm hello. o hello
Primer Makefile-a > make gcc -c hello. c gcc -o hello. o Pokretanje make bez argumenata pokreće prvo pravilo na koje se naiđe, u ovom slučaju all Pravilo se sastoji od tri dela: 1. Odredište (target) 2. Lista preduslova (pre-requisites list) 3. Komande (commands)
Struktura makefile pravila target: pre-req 1 pre-req 2. . . command. . Odredište i preduslovi su odvojeni sa : Komanda mora da počne sa TAB (ne space-ovi) Kada make evaluira pravilo, kreće se sa traženjem fajlova koji se nalaze u preduslovima. Ako ijedan od preduslova ima asocirano novo pravilo, to pravilo će biti prvo ažurirano
Struktura makefile pravila U primeru navedenom ranije, prvo pravilo na koje se naiđe je “all” koje kao preduslov ima hello. Make ne može da pronađe fajl hello (barem u prvom pozivu), tako da traži odgovarajuće pravilo kako bi kreirao njega Pravilo hello ima preduslov “hello. o” i pošto ni taj fajl ne postoji, na sličan način se traži pravilo za njega Pravilo za “hello. o” ima preduslov “hello. c”, koji postoji u direktorijumu. Make tada proverava da li je hello. c ažuriran nakon poslednjeg pokretanja “make” komande. Ukoliko jeste, pokreće se komanda “gcc –c hello. c”. Rekurzivno unazad, pravilo “hello” će dalje da pokrene komandu “gcc –o hello. o”, dok pravilo “all” ne radi zapravo ništa
Struktura makefile pravila Ukoliko preduslov nije noviji od odredišta, komanda se neće pokrenuti Drugim rečima, komanda će se pokrenuti samo ako je odredište zastarelo u poređenju sa preduslovom (obratite pažnju da su i jedan i drugi zapravo fajlovi) Kao povrda toga, ako ponovo pokrenemo “make” komandu dobijamo sledeći ispis: make: Nothing to be done for “all”
Make poziv Prilikom pozivanja make komande, moguće je specificirati odredište, npr “make clean” uklanja fajlove hello. o i hello. Ukoliko se pokrene “make” bez odredišta pozvaće se prvo odredište na koje se naiđe: “make all” je isto kao i “make” u primeru od gore Ukoliko komanda ne počinje za karakterom TAB, dobija se komanda “makefile: 4: *** missing separator. Stop. ” Ukoliko ne postoji makefile u trenutnom direktorijum dobija se greska “make: *** No targets specified and no makefile found. Stop. ”
Make -- napredno Makefile može da sadrži komentare koji počinju sa # i važe do kraja reda u kome su napisani Dugačke linije mogu biti “prelomljene” korišćenjem Pravila su obično organizovana tako da generalnija pravila idu prva: npr. Prvo pravilo u primeru od malopre je pravilo “all” koje rekurzivno poziva sva ostala pravila Tzv Lažna odredišta (phony targets) su odredišta koja ne predstavljaju fajlove. Na primeru od malopre “clean” bi bio jedan primer takvog lažnog odredišta. Ukoliko je odredište fajl, biće proverena zastarelost njegovih preduslova, dok se lažna pravila uvek izvršavaju. Standardna lažna pravila su all, clean i install.
Make -- napredno Promenljive počinju sa znakom $ i nalaze se unutar zagrada () ili {}, a promenljive od jednog karaktera ne zahtevaju zagrade, na primer $(CC), $(CC_FLAGS), $@, $^ Automatske promenljive se postavljaju nakon što je prepoznato pravilo: $@ -- ime fajla odredišta $* $< -- ime fajla prvog preduslova $^ -- imena svih preduslova, razdvojenih bez dupliranja $+ -- isto kao gore, ali sa dupliranjima -- ime fajla odredišta bez ekstenzije $? -- imena svih preduslova novijih od odredišta, razdvojenih space-om
Make -- napredno Primer makefile-a od malopre: all: hello # $@ matches the target; $< matches the first dependent hello: hello. o gcc -o $@ $< hello. o: hello. c gcc -c $< clean: rm hello. o hello
Virtualna putanja Moguće je koristiti VPATH kako bi se specificirao direktorijum u kome se mogu tražiti preduslovi i odredišta (fajlovi). Na primer: # Search for dependencies and targets from "src" and "include" directories # The directories are separated by space VPATH = src include • Takođe, moguće je koristiti vpath kako bi se specificirao tip fajla koji se traži u direktorijumu. Na primer: # Search for. c files in "src" directory; . h files in "include" directory # The pattern matching character '%' matches filename without the extension vpath %. c src vpath %. h include
Šablonska pravila Šablonsko pravilo, koje koristi karakter poklapanja “%” umesto imena fajla, može se primeniti kako bi se kreiralo odredište, ukoliko nema eksplicitnog pravila. Na primer: # Applicable for create. o object file. # '%' matches filename. # $< is the first pre-requisite # $(COMPILE. c) consists of compiler name and compiler options # $(OUTPUT_OPTIONS) could be -o $@ %. o: %. c $(COMPILE. c) $(OUTPUT_OPTION) $< # Applicable for create executable (without extension) from object. o object file # $^ matches all the pre-requisites (no duplicates) %: %. o $(LINK. o) $^ $(LOADLIBES) $(LDLIBS) -o $@
Primer makefile-a 1 # A sample Makefile # This Makefile demonstrates and explains # Make Macros, Macro Expansions, # Rules, Targets, Dependencies, Commands, Goals # Artificial Targets, Pattern Rule, Dependency Rule. # Comments start with a # and go to the end of the line. # Here is a simple Make Macro. LINK_TARGET = test_me # Here is a Make Macro that uses the backslash to extend to multiple lines. OBJS = Test 1. o Test 2. o Main. o
Primer makefile-a 2 # Here is a Make Macro defined by two Macro Expansions. # A Macro Expansion may be treated as a textual replacement of the Make Macro. # Macro Expansions are introduced with $ and enclosed in (parentheses). REBUILDABLES = $(OBJS) $(LINK_TARGET) # Here is a simple Rule (used for "cleaning" your build environment). # It has a Target named "clean" (left of the colon ": " on the first line), # no Dependencies (right of the colon), # and two Commands (indented by tabs on the lines that follow). # The space before the colon is not required but added here for clarity. clean : rm -f $(REBUILDABLES) echo Clean done
Primer makefile-a 3 # There are two standard Targets your Makefile should probably have: # "all" and "clean", because they are often command-line Goals. # Also, these are both typically Artificial Targets, because they don't typically # correspond to real files named "all" or "clean". # The rule for "all" is used to incrementally build your system. # It does this by expressing a dependency on the results of that system, # which in turn have their own rules and dependencies. all : $(LINK_TARGET) echo All done
Primer makefile-a 4 # There is no required order to the list of rules as they appear in the Makefile. # Make will build its own dependency tree and only execute each rule only once # its dependencies' rules have been executed successfully. # Here is a Rule that uses some built-in Make Macros in its command: # $@ expands to the rule's target, in this case "test_me". # $^ expands to the rule's dependencies, in this case three files # main. o, test 1. o, and test 2. o. $(LINK_TARGET) : $(OBJS) g++ -g -o $@ $^
Primer makefile-a 5 # Here is a Pattern Rule, often used for compile-line. # It says how to create a file with a. o suffix, given a file with a. cpp suffix. # The rule's command uses some built-in Make Macros: # $@ for the pattern-matched target # $< for the pattern-matched dependency %. o : %. cpp g++ -g -o $@ -c $<
Primer makefile-a 6 # These are Dependency Rules, which are rules without any command. # Dependency Rules indicate that if any file to the right of the colon changes, # the target to the left of the colon should be considered out-of-date. # The commands for making an out-of-date target up-to-date may be found elsewhere # (in this case, by the Pattern Rule above). # Dependency Rules are often used to capture header file dependencies. Main. o : Main. h Test 1. h Test 2. h Test 1. o : Test 1. h Test 2. o : Test 2. h
Dependancies sources=$(wildcard *. c) objs=$(sources: . c=. o) all: result: $(objs) $(CC) -o $@ $^ %. d: %. c @set -e; rm -f $@; $(CC) -M $(CPPFLAGS) $< > $@. $$$$; sed 's, ($*). o[ : ]*, 1. o $@ : , g' < $@. $$$$ > $@; rm -f $@. $$$$ -include $(sources: . c=. d) clean: rm result *. o
Dependancies Makefile segment prikazan na prethodnom slajdu omogućava automatsko prepoznavanje fajlova od kojih zavise fajlovi koji se kompajliraju, što omogućava automatsko pokretanje kompajliranja i povezivanja svaki put kada se bilo koji od tih fajlova promeni Primer bi bili. h fajlovi-promena nekog. h fajla ne bi izazvala ponovno kompajliranje fajlova koji zavise od njega Ručno dodavanje zavisnosti od. h fajlova takođe nije praktično jer se to mora onda raditi svaki put kada se doda #include “xxxx. h” direktiva u izvornom fajlu
- Etf beograd
- Upravljanje u realnom vremenu
- Rpm to rev/min
- Operativni sistemi seminarski rad
- Sta je operativni sistem
- Operativni sistemi seminarski rad
- Operativni sistemi seminarski rad
- Tijelo harmonijski titra amplitudom 2 cm
- V t graf
- Gcc accreditation center
- Gcc freedom of movement
- Gcc certificate requirements
- Glendale nursing program
- Attività peptidil transferasica
- Gcc
- Vim gcc
- Ibm stg
- Gcc -z execstack
- Gnu gcc is a: cross compiler assembler linker loader
- Download flex gnuwin64
- Gcc logo
- Gcc nursing program prerequisites
- Tender definition
- Gcc dual enrollment classes
- Gcc stdio.h
- Gcc
- Rad basic
- Kupus kao indikator
- Rad iterative development
- Društvene mreže seminarski rad
- Open source rad
- Uvod u laboratorijski rad
- El camino college radiology
- Seminarski rad
- Craig chapman
- Pravni fakultet zagreb socijalni rad
- Prvi zakon termodinamike
- Rad i snaga električne struje