c makefile tutorial
V tej vadnici C ++ Makefile bomo razpravljali o glavnih vidikih orodja Make in makefile, vključno z njegovimi prednostmi in aplikacijami v jeziku C ++:
V katerem koli projektu C ++ je eden od pomembnih ciljev poenostaviti gradnjo projekta, tako da dobimo vse odvisnosti in projektne datoteke na enem mestu in jih izvedemo v enem zamahu, tako da dobimo želeni izhod z enim samim ukazom.
vprašanja za intervju s selenom za 4-letne izkušnje
Hkrati pa, kadar koli se katera od projektnih datotek spremeni, nam ni treba ponovno groziti težav z gradnjo celotnega projekta, tj. Kadar se v projektu spremeni datoteka ali dve, obnovimo samo te spremenjene datoteke in nato nadaljujemo z izvršbo.
=> Preberite serijo Easy C ++ Training Series.
To so natančno tiste funkcije, ki jih orodje 'make' in 'makefiles' obravnavajo v jeziku C ++. V tej vadnici bomo razpravljali o vseh glavnih vidikih make datotek in njihovih aplikacijah v jeziku C ++.
Kaj se boste naučili:
Make Tool
Make je orodje UNIX in se uporablja kot orodje za poenostavitev gradnje izvršljive datoteke iz različnih modulov projekta. Obstajajo različna pravila, ki so določena kot ciljni vnosi v datoteki make. Orodje make prebere vsa ta pravila in se ustrezno obnaša.
Na primer, če pravilo določa kakršno koli odvisnost, bo orodje make to odvisnost vključilo za namene prevajanja. Ukaz make se uporablja v datoteki make za izdelavo modulov ali čiščenje datotek.
Splošna sintaksa make je:
%make target_label #target_label is a specific target in makefile
Na primer , če želimo izvršiti ukaze rm za čiščenje datotek, zapišemo:
% make clean #here clean je ciljna oznaka, določena za ukaze rm
C ++ Makefile
Makefile ni nič drugega kot besedilna datoteka, ki se uporablja ali sklicuje na ukaz 'make' za izdelavo ciljev. Datoteka make vsebuje tudi informacije, kot so odvisnosti na ravni vira za vsako datoteko, pa tudi odvisnosti od vrstnega reda gradnje.
Zdaj pa poglejmo splošno strukturo makefile.
Makefile se običajno začne z deklaracijami spremenljivk, ki jim sledi nabor ciljnih vnosov za gradnjo določenih ciljev. Ti cilji so lahko datoteke .o ali druge izvedljive datoteke v C ali C ++ in datoteke .class v Javi.
Lahko imamo tudi nabor ciljnih vnosov za izvajanje nabora ukazov, določenih s ciljno oznako.
Torej je splošna make-datoteka prikazana spodaj:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Preprost primer make datoteke je prikazan spodaj.
# 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
V zgornji datoteki make smo določili dve ciljni nalepki, prva je oznaka 'all' za izdelavo izvršljive datoteke iz datotek myprogram in mylib. Druga ciljna oznaka 'clean' odstrani vse datoteke z imenom 'myprogram'.
Poglejmo še eno različico 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)
Kot je prikazano v zgornjem primeru, v tej datoteki make uporabljamo spremenljivko 'CC', ki vsebuje vrednost prevajalnika, ki jo uporabljamo (v tem primeru GCC). Druga spremenljivka „CFLAGS“ vsebuje zastavice prevajalnika, ki jih bomo uporabili.
Tretja spremenljivka „TARGET“ vsebuje ime programa, za katerega moramo zgraditi izvedljivo datoteko.
Merilna prednost te spremembe make datoteke je, da moramo spremeniti vrednosti spremenljivk, ki smo jih uporabili, kadar koli pride do sprememb v prevajalniku, zastavicah prevajalnika ali imenu izvedljivega programa.
Primer izdelave in izdelave datoteke
Razmislite o primeru programa z naslednjimi datotekami:
- Main.cpp: Program glavnega gonilnika
- Point.h: Datoteka glave za razred točke
- Point.cpp: Datoteka za izvajanje CPP za razred točk
- Square.h: Datoteka glave za kvadratni razred
- Square.cpp; Datoteka za izvajanje CPP za kvadratni razred
Z zgoraj navedenima datotekama .cpp in .h moramo te datoteke zbrati ločeno, da ustvarimo datoteke .o in jih nato povezati v izvršljivo datoteko z imenom main.
Nato te datoteke zberemo ločeno.
- g ++ -c main.cpp: generira main.o
- g ++ -c point.cpp: ustvari točko.o
- g ++ -c square.cpp: ustvarja kvadrat.o
Nato objektne datoteke povežemo skupaj, da ustvarimo izvršljivo glavno datoteko.
g ++ -o glavna glavna.o točka.o kvadrat.o
Nato se moramo odločiti, katero datoteko bomo morali znova sestaviti in regenerirati, ko bodo posodobljeni nekateri deli programa. Za to bomo imeli grafikon odvisnosti ki prikazuje različne odvisnosti za vsako izvedbeno datoteko.
Spodaj je tabela odvisnosti za zgornje datoteke.
Torej, v zgornjem grafikonu odvisnosti lahko v korenu vidimo izvedljivo 'main'. Izvršljivi 'main' je sestavljen iz predmetnih datotek, tj. main.o, point.o, square.o, ki se ustvari s prevajanjem main.cpp, point.cpp oziroma square.cpp.
Vse izvedbe cpp uporabljajo datoteke z glavo, kot je prikazano na zgornjem grafikonu. Kot je prikazano zgoraj, main.cpp se sklicuje na point.h in square.h, saj gre za gonilniški program in uporablja razrede point in square.
Naslednja datoteka point.cpp se sklicuje na point.h. Tretja datoteka square.cpp se sklicuje na square.h in point.h, saj bo za risanje kvadrata potrebovala tudi točko.
Iz zgornje tabele odvisnosti je razvidno, da moramo vsakič, ko se spremeni katera koli datoteka .cpp ali .h, na katero se sklicuje datoteka .cpp, to datoteko .o. Na primer, ko se main.cpp spremeni, moramo regenerirati main.o in znova povezati predmetne datoteke, da ustvarimo glavno izvedljivo datoteko.
Vse zgoraj navedene razlage bodo delovale brez težav, če bo v projektu malo datotek. Ko je projekt ogromen in je datotek velikih in preveč, je težko datoteke večkrat regenerirati.
Tako se odločimo za izdelavo datotek in uporabljamo orodje za izdelavo projekta in generiranje izvedljive datoteke.
Videli smo že različne dele datoteke make. Upoštevajte, da mora biti datoteka poimenovana 'MAKEFILE' ali 'makefile' in jo je treba shraniti v izvorno mapo.
Zdaj bomo zapisali datoteko make za zgornji primer.
Določili bomo spremenljivke, ki bodo imele vrednosti zastav prevajalnika in prevajalnika, kot je prikazano spodaj.
CC = g++ CFLAGS = -wall -g
Nato ustvarimo prvi cilj v naši datoteki make, to je izvršljivi main. Torej napišemo tarčo z njenimi odvisnostmi.
glavni: glavni.o točka.o kvadrat.o
Tako je ukaz za generiranje tega cilja
$(CC) $(CFLAGS) –o main main.o point.o square.o
Opomba: Zgornji ukaz se dejansko prevede v g ++ -wall –g –o main main.o point.o square.o
Naš naslednji cilj bo ustvarjanje predmetnih datotek, main.o, point.o, square.o
Zdaj, da se generira main.o, bo cilj zapisan kot:
Main.o: main.cpp point.h square.h
Ukaz za ta cilj je:
$(CC) $(CFLAGS) –c main.cpp
Naslednjo datoteko point.o lahko ustvarite s spodnjim ukazom:
$(CC) $(CFLAGS) –c point.h
V zgornjem ukazu smo preskočili point.cpp. To je zato, ker make že ve, da so datoteke .o ustvarjene iz datotek .cpp, zato je dovolj samo .h (vključi datoteko).
Podobno lahko kvadrat.o generiramo z naslednjim ukazom.
$(CC) $(CFLAGS) –c square.h point.h
Celotna datoteka make za ta primer bo videti spodaj:
# 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
Tako vidimo, da imamo popolno datoteko make, ki prevede tri datoteke C ++ in nato iz predmetnih datotek ustvari izvršljivo glavno datoteko.
Prednosti make-datotek
- Ko gre za velike projekte, nam uporaba make-datotek pomaga, da projekt predstavljamo sistematično in učinkovito.
- Makefiles omogočajo, da je izvorna koda bolj jedrnata, enostavna za branje in odpravljanje napak.
- Makefiles samodejno prevede samo tiste datoteke, ki so spremenjene. Tako nam ni treba regenerirati celotnega projekta, ko so spremenjeni nekateri deli projekta.
- Orodje Make nam omogoča sestavljanje več datotek hkrati, tako da je mogoče vse datoteke zbrati v enem koraku.
Zaključek
Makefili so dobro za razvoj programske opreme. Z uporabo make datoteke C ++ lahko rešitve zgradimo v krajšem času. Tudi ko se del projekta spremeni, makefile znova prevede in regenerira samo tisti del, ne da bi bilo treba regenerirati celoten projekt.
C ++ Makefile nam omogoča, da projekt sistematično in učinkovito predstavljamo, s čimer je bolj berljiv in enostaven za odpravljanje napak.
V tej vadnici C ++ Makefile smo podrobno videli makefile in orodja za izdelavo. Razpravljali smo tudi o tem, kako napisati datoteko make iz nič.
=> Tukaj si oglejte Perfect Guide za usposabljanje za C ++.
Priporočeno branje
- 70+ NAJBOLJŠIH vaj za C ++ za BREZPLAČNO učenje C ++ programiranja
- Dev C ++ IDE: Namestitev, funkcije in razvoj C ++
- Popoln pregled C ++
- Predmeti datoteke VBScript: CopyFile, DeleteFile, OpenTextFile, branje in pisanje besedilne datoteke
- Vadnica za obdelavo datotek Python: Kako ustvariti, odpreti, prebrati, zapisati
- Ukaz datotečnega sistema Unix Touch, Cat, Cp, Mv, Rm, Mkdir (del B)
- 12 najboljših IDE-jev za urejanje Python in urejevalnikov kod v letu 2021
- 15 najboljših brezplačnih urejevalnikov kod za popolno kodiranje