c makefile tutorial
V tomto výučbe C ++ Makefile sa budeme venovať hlavným aspektom nástroja Make a makefile vrátane jeho výhod a aplikácií v C ++:
V ktoromkoľvek projekte v C ++ je jedným z dôležitých cieľov zjednodušiť zostavenie projektu tak, aby sme dostali všetky závislosti a súbory projektu na jednom mieste a vykonali ich naraz, aby sme jediným príkazom dostali požadovaný výstup.
implementovať binárny vyhľadávací strom v jave
Zároveň vždy, keď sa upravuje ktorýkoľvek zo súborov projektu, nemusíme prechádzať problémami s budovaním celého projektu, tj. Vždy, keď sa v projekte upraví jeden alebo dva súbory, obnovíme iba tieto zmenené súbory a potom pokračujeme s exekúciou.
=> Prečítajte si sériu školení Easy C ++.
Toto sú presne tie funkcie, ktoré riešia nástroje „make“ a „makefiles“ v C ++. V tomto tutoriáli sa budeme venovať všetkým hlavným aspektom makefilov a ich aplikácií v C ++.
Čo sa dozviete:
Make Tool
Make je nástroj UNIX a používa sa ako nástroj na zjednodušenie zostavenia spustiteľného súboru z rôznych modulov projektu. Existujú rôzne pravidlá, ktoré sú zadané ako cieľové položky v makefile. Nástroj na výrobu prečíta všetky tieto pravidlá a podľa toho sa správa.
Napríklad, ak pravidlo špecifikuje akúkoľvek závislosť, potom nástroj na zahrnutie túto závislosť zahrnie na účely kompilácie. Príkaz make sa používa v makefile na zostavenie modulov alebo na vyčistenie súborov.
Všeobecná syntax značky make je:
%make target_label #target_label is a specific target in makefile
Napríklad , ak chceme vykonať rm príkazy na vyčistenie súborov, napíšeme:
% make clean #here clean je target_label zadaný pre rm príkazy
C ++ Makefile
Makefile nie je nič iné ako textový súbor, ktorý sa používa alebo na ktorý odkazuje príkaz „make“ na zostavenie cieľov. Makefile obsahuje aj informácie, ako sú závislosti na zdrojovej úrovni pre každý súbor, ako aj závislosti na zostavení.
Teraz sa pozrime na všeobecnú štruktúru súboru makefile.
Makefile zvyčajne začína deklaráciami premenných, za ktorými nasleduje množina cieľových položiek pre zostavenie konkrétnych cieľov. Tieto ciele môžu byť .o alebo iné spustiteľné súbory v súboroch C alebo C ++ a .class v prostredí Java.
Môžeme mať aj množinu cieľových položiek na vykonávanie množiny príkazov určených štítkom cieľa.
Všeobecný makefile je teda uvedený nižšie:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Jednoduchý príklad súboru makefile je uvedený nižšie.
# a build command to build myprogram executable from myprogram.o and mylib.lib all:myprogram.o mylib.o gcc –o myprogram myprogram.o mylib.o clean: $(RM) myprogram
Vo vyššie uvedenom súbore makefile sme určili dva cieľové štítky, prvý je štítok „all“ na zostavenie spustiteľného súboru zo súborov objektov myprogram a mylib. Druhý cieľový štítok „vyčistiť“ odstráni všetky súbory s názvom „myprogram“.
Pozrime sa na ďalšiu variáciu súboru makefile.
# the compiler: gcc for C program, define as g++ for C++ CC = gcc # compiler flags: # -g - this flag adds debugging information to the executable file # -Wall - this flag is used to turn on most compiler warnings CFLAGS = -g -Wall # The build target TARGET = myprogram all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c clean: $(RM) $(TARGET)
Ako je uvedené v predchádzajúcom príklade, v tomto makefile používame premennú „CC“, ktorá obsahuje hodnotu kompilátora, ktorú používame (v tomto prípade GCC). Ďalšia premenná ‘CFLAGS’ obsahuje príznaky kompilátora, ktoré použijeme.
Tretia premenná ‘TARGET’ obsahuje názov programu, pre ktorý potrebujeme zostaviť spustiteľný súbor.
Výhodou opatrenia tejto variácie súboru makefile je, že stačí zmeniť hodnoty premenných, ktoré sme použili, vždy, keď dôjde k zmene kompilátora, príznakov kompilátora alebo názvu spustiteľného programu.
Príklad značky a súboru makefile
Zvážte príklad programu s nasledujúcimi súbormi:
- Main.cpp: Hlavný vodičský program
- Point.h: Hlavičkový súbor pre bodovú triedu
- Point.cpp: Súbor implementácie CPP pre bodovú triedu
- Square.h: Hlavičkový súbor pre štvorcovú triedu
- Square.cpp; Súbor implementácie CPP pre štvorcovú triedu
S vyššie uvedenými súbormi .cpp a .h musíme tieto súbory skompilovať osobitne, aby sme vygenerovali súbory .o a potom ich prepojili do spustiteľného súboru s názvom main.
Ďalej teda tieto súbory zostavujeme osobitne.
- g ++ -c main.cpp: generuje main.o
- g ++ -c point.cpp: generuje point.o
- g ++ -c square.cpp: generuje square.o
Ďalej prepojíme súbory objektov, aby sme vytvorili spustiteľný súbor main.
g ++ -o hlavný main.o point.o štvorec.o
Ďalej sa musíme rozhodnúť, ktoré zo súborov budeme musieť prekompilovať a regenerovať, keď sa aktualizujú určité časti programu. Na to budeme mať graf závislosti ktorý zobrazuje rôzne závislosti pre každý z implementačných súborov.
Ďalej je uvedený graf závislostí vyššie uvedených súborov.
Takže vo vyššie uvedenom grafe závislostí môžeme vidieť spustiteľný súbor „main“ v koreni. Spustiteľný súbor „main“ pozostáva z objektových súborov, tj. main.o, point.o, square.o, ktoré sa generujú kompiláciou main.cpp, point.cpp a square.cpp.
Všetky implementácie cpp používajú hlavičkové súbory, ako je to znázornené v grafe vyššie. Ako je uvedené vyššie, main.cpp odkazuje na point.h aj square.h, pretože je to program ovládača a používa triedy point and square.
Ďalší súbor point.cpp odkazuje na point.h. Tretí súbor square.cpp odkazuje na square.h aj point.h, pretože na nakreslenie štvorca bude potrebovať aj bod.
Z grafu závislostí vyššie je zrejmé, že vždy, keď sa zmení akýkoľvek súbor .cpp alebo .h, na ktorý odkazuje súbor .cpp, musíme tento súbor .o znovu vygenerovať. Napríklad, keď sa main.cpp zmení, musíme vygenerovať main.o a znova prepojiť súbory objektov, aby sme vygenerovali hlavný spustiteľný súbor.
Všetky vyššie uvedené vysvetlenia budú fungovať bez problémov, ak je v projekte niekoľko súborov. Ak je projekt obrovský a súborov je príliš veľa, potom je ťažké súbory opakovane regenerovať.
Ideme teda na vytváranie súborov a pomocou neho vytvoríme nástroj na zostavenie projektu a vygenerovanie spustiteľného súboru.
Už sme videli rôzne časti súboru značiek. Upozorňujeme, že súbor by mal mať názov „MAKEFILE“ alebo „makefile“ a mal by byť umiestnený v zdrojovom priečinku.
Teraz si napíšeme makefile pre vyššie uvedený príklad.
Definujeme premenné, ktoré budú obsahovať hodnoty kompilátora a jeho príznakov, ako je uvedené nižšie.
CC = g++ CFLAGS = -wall -g
Potom vytvoríme prvý cieľ v našom makefile, tj spustiteľný súbor main. Takže napíšeme cieľ s jeho závislosťami.
main: main.o point.o square.o
Príkaz na vygenerovanie tohto cieľa je teda
$(CC) $(CFLAGS) –o main main.o point.o square.o
Poznámka: Vyššie uvedený príkaz sa v skutočnosti prekladá do g ++ -wall –g –o main main.o point.o square.o
Naším ďalším cieľom bude generovať súbory objektov, main.o, point.o, square.o
Teraz, aby sa vygeneroval main.o, bude cieľ napísaný ako:
Main.o: main.cpp point.h square.h
Príkaz pre tento cieľ je:
$(CC) $(CFLAGS) –c main.cpp
Nasledujúci súbor point.o je možné vygenerovať pomocou nasledujúceho príkazu:
$(CC) $(CFLAGS) –c point.h
Vo vyššie uvedenom príkaze sme preskočili point.cpp. Je to tak preto, lebo značka už vie, že súbory .o sú generované zo súborov .cpp, takže stačí iba súbor .h (zahrnúť súbor).
Podobne je možné square.o vygenerovať pomocou nasledujúceho príkazu.
$(CC) $(CFLAGS) –c square.h point.h
Celý makefile pre tento príklad bude vyzerať takto:
# Makefile for Writing Make Files Example # ***************************************************** # Variables to control Makefile operation CC = g++ CFLAGS = -Wall -g # **************************************************** # Targets needed to bring the executable up to date main: main.o Point.o Square.o $(CC) $(CFLAGS) -o main main.o Point.o Square.o # The main.o target can be written more simply main.o: main.cpp Point.h Square.h $(CC) $(CFLAGS) -c main.cpp Point.o: Point.h Square.o: Square.h Point.h
Vidíme teda, že máme kompletný makefile, ktorý kompiluje tri súbory C ++ a potom vygeneruje spustiteľný main zo súborov objektov.
Výhody Makefiles
- Pokiaľ ide o veľké projekty, použitie makefilov nám pomáha systematicky a efektívne reprezentovať projekt.
- Makefiles robí zdrojový kód stručnejším a ľahšie čitateľným a laditeľným.
- Makefiles automaticky kompiluje iba tie súbory, ktoré sú zmenené. Preto nemusíme regenerovať celý projekt, keď sú zmenené niektoré jeho časti.
- Nástroj Make nám umožňuje kompilovať viac súborov naraz, aby bolo možné všetky súbory kompilovať v jednom kroku.
Záver
Makefiles sú prínosom pre vývoj softvéru. Pomocou súboru C ++ môžeme vytvárať riešenia za kratší čas. Taktiež keď dôjde k úprave časti projektu, makefile prekompiluje a regeneruje iba túto časť bez nutnosti regenerácie celého projektu.
C ++ Makefile nám umožňuje systematicky a efektívne reprezentovať projekt, vďaka čomu je čitateľnejší a ľahšie laditeľný.
V tomto výučbe C ++ Makefile sme videli makefile a nástroje podrobne. Diskutovali sme tiež o tom, ako napísať makefile od nuly.
=> Tu si pozrite perfektného školiaceho sprievodcu pre C ++.
Odporúčané čítanie
- 70+ NAJLEPŠÍCH tutoriálov pre C ++ Naučte sa programovanie v C ++ ZADARMO
- Dev C ++ IDE: Inštalácia, funkcie a vývoj v C ++
- Kompletný prehľad jazyka C ++
- Objekty súboru VBScript: CopyFile, DeleteFile, OpenTextFile, čítanie a zápis textového súboru
- Výukový program pre manipuláciu so súbormi v Pythone: Ako vytvárať, otvárať, čítať a zapisovať
- Príkazy systému súborov Unix Touch, Cat, Cp, Mv, Rm, Mkdir (časť B)
- 12 najlepších IDE a editorov kódu v Pythone v roku 2021
- Top 15 najlepších editorov bezplatných kódov pre dokonalý zážitok z kódovania