c makefile tutorial
I denne C ++ Makefile-selvstudie vil vi diskutere de vigtigste aspekter af Make-værktøj og makefile, herunder dets fordele og applikationer i C ++:
I ethvert C ++ - projekt er et af de vigtige mål at forenkle opbygningen af projektet, så vi får alle afhængigheder og projektfiler ét sted og udfører dem på én gang, så vi får den ønskede output med en enkelt kommando.
typer af funktioner c ++
På samme tid, når nogen af projektfilerne ændres, behøver vi ikke gå igennem besværet med at opbygge hele projektet igen, dvs. når en fil eller to ændres i projektet, genopbygger vi kun disse ændrede filer og fortsætter derefter med henrettelsen.
=> Læs gennem Easy C ++ træningsserien.
Dette er nøjagtigt de funktioner, der adresseres af 'make' -værktøjet og 'makefiles' i C ++. I denne vejledning diskuterer vi alle de vigtigste aspekter af makefiles samt deres applikationer i C ++.
Hvad du vil lære:
Lav værktøj
Make er et UNIX-værktøj og bruges som et værktøj til at forenkle bygningskørbarhed fra forskellige moduler i et projekt. Der er forskellige regler, der er angivet som målposter i makefilen. Mærkeværktøjet læser alle disse regler og opfører sig i overensstemmelse hermed.
For eksempel, hvis en regel angiver nogen afhængighed, vil fabrikationsværktøjet omfatte denne afhængighed til kompileringsformål. Make-kommandoen bruges i makefilen til at opbygge moduler eller rydde op i filerne.
Den generelle syntaks for fabrikat er:
%make target_label #target_label is a specific target in makefile
For eksempel , hvis vi vil udføre rm-kommandoer for at rydde op i filer, skriver vi:
% make clean #here clean er en target_label angivet til rm-kommandoer
C ++ Makefile
En makefile er intet andet end en tekstfil, der bruges eller henvises til med kommandoen 'make' til at opbygge målene. En makefile indeholder også oplysninger som afhængighedsniveauer på kildeniveau for hver fil såvel som afhængighed af build-ordre.
Lad os nu se den generelle struktur for makefile.
En makefile starter typisk med variable erklæringer efterfulgt af et sæt målindgange til opbygning af specifikke mål. Disse mål kan være .o eller andre eksekverbare filer i C- eller C ++- og .class-filer i Java.
Vi kan også have et sæt målindgange til udførelse af et sæt kommandoer, der er angivet af måletiketten.
Så en generisk makefile er som vist nedenfor:
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
Et simpelt eksempel på makefilen er vist nedenfor.
# 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
I ovenstående makefile har vi angivet to målmærker, først er etiketten 'alle', der skal bygges eksekverbar fra myprogram- og mylib-objektfiler. Det andet målmærke 'rent' fjerner alle filerne med navnet 'mit program'.
Lad os se en anden variation af makefilen.
# 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)
Som vist i ovenstående eksempel bruger vi i denne makefile variablen 'CC', der indeholder den kompilatorværdi, vi bruger (GCC i dette tilfælde). En anden variabel 'CFLAGS' indeholder de kompilatorflag, som vi vil bruge.
Den tredje variabel 'TARGET' indeholder navnet på det program, som vi skal bygge den eksekverbare version til.
Målefordelen ved denne variation af makefilen er, at vi bare skal ændre værdierne for de variabler, som vi har brugt, når der er nogen ændring i kompilatoren, kompilatorflaggen eller det eksekverbare programnavn.
Eksempel på Make And Makefile
Overvej et programeksempel med følgende filer:
- Main.cpp: Hoveddriverprogram
- Punkt.h: Overskriftsfil til punktklasse
- Punkt.cpp: CPP-implementeringsfil til pointklasse
- Square.h: Overskriftsfil til firkantet klasse
- Square.cpp; CPP-implementeringsfil til kvadratklasse
Med de ovennævnte .cpp- og .h-filer skal vi kompilere disse filer separat for at generere .o-filer og derefter linke dem til eksekverbar navngivet main.
Så derefter kompilerer vi disse filer separat.
- g ++ -c main.cpp: genererer main.o
- g ++ -c point.cpp: genererer et punkt. o
- g ++ -c firkant.cpp: genererer firkantet. o
Dernæst forbinder vi objektfilerne sammen for at generere den eksekverbare main.
g ++ -o main main.o point.o square.o
Dernæst er vi nødt til at beslutte, hvilke af de filer, vi bliver nødt til at kompilere og regenerere, når visse dele af programmet opdateres. Til dette vil vi have en afhængighedsdiagram der viser forskellige afhængigheder for hver af implementeringsfilerne.
Nedenfor er afhængighedsdiagrammet for ovenstående filer.
Så i ovenstående afhængighedsdiagram kan vi se den eksekverbare 'hoved' ved roden. Den eksekverbare 'hoved' består af objektfiler, dvs. main.o, point.o, square.o der genereres ved at kompilere henholdsvis main.cpp, point.cpp og square.cpp.
Alle cpp-implementeringer bruger headerfiler som vist i ovenstående diagram. Som vist ovenfor henviser main.cpp til både point.h og square.h, da det er driverprogrammet og bruger punkt- og firkantklasser.
Næste fil point.cpp referencer point.h. Den tredje fil square.cpp henviser til square.h såvel som point.h, da den også har brug for et punkt for at tegne firkanten.
Fra afhængighedstabellen ovenfor er det klart, at når en .cpp-fil eller .h-fil, der henvises til af .cpp-filændringer, er vi nødt til at gendanne den .o-fil. For eksempel, når main.cpp ændres, er vi nødt til at regenerere main.o og linke objektfilerne igen for at generere den vigtigste eksekverbare.
Alle ovenstående forklaringer, som vi har givet, fungerer problemfrit, hvis der er få filer i projektet. Når projektet er stort, og filerne er store og for mange, bliver det vanskeligt at gendanne filerne gentagne gange.
Således går vi for at lave filer, og vi bruger til at lave et værktøj til at opbygge projektet og generere den eksekverbare.
Vi har allerede set forskellige dele af en make-fil. Bemærk, at filen skal have navnet 'MAKEFILE' eller 'makefile' og skal placeres i kildemappen.
Nu vil vi skrive ned makefilen til ovenstående eksempel.
Vi definerer variabler, der holder værdierne for compiler- og compiler-flag som vist nedenfor.
CC = g++ CFLAGS = -wall -g
Derefter opretter vi det første mål i vores makefile, dvs. den eksekverbare hoved. Så vi skriver et mål med dets afhængigheder.
main: main.o point.o square.o
Således er kommandoen til at generere dette mål
$(CC) $(CFLAGS) –o main main.o point.o square.o
Bemærk: Ovenstående kommando oversættes faktisk til g ++ - væg –g –o hoved main.o point.o firkant.o
Vores næste mål er at generere objektfiler, main.o, point.o, square.o
Nu for at generere main.o, vil målet blive skrevet som:
Main.o: main.cpp point.h square.h
Kommandoen til dette mål er:
$(CC) $(CFLAGS) –c main.cpp
Den næste fil point.o kan genereres ved hjælp af nedenstående kommando:
$(CC) $(CFLAGS) –c point.h
I ovenstående kommando har vi sprunget over point.cpp. Dette skyldes, at make allerede ved, at .o-filer genereres fra .cpp-filerne, og derfor kun .h (inkluder fil) er nok.
På samme måde kan square.o genereres med følgende kommando.
$(CC) $(CFLAGS) –c square.h point.h
Hele makefilen til dette eksempel ser ud som vist nedenfor:
# 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
Således ser vi, at vi har en komplet makefil, der kompilerer tre C ++ filer og derefter genererer en eksekverbar main fra objektfilerne.
Fordele ved Makefiles
- Når det kommer til store projekter, hjælper det os med at repræsentere projektet på en systematisk og effektiv måde ved hjælp af makefiles.
- Makefiles gør kildekoden mere kortfattet og nem at læse og fejle.
- Makefiles kompilerer automatisk kun de filer, der ændres. Således behøver vi ikke regenerere hele projektet, når nogle af delene af projektet ændres.
- Make-værktøj giver os mulighed for at kompilere flere filer på én gang, så alle filerne kan kompileres i et enkelt trin.
Konklusion
Makefiles er en velsignelse for softwareudvikling. Ved hjælp af en C ++ makefile kan vi bygge løsninger på kortere tid. Også når en del af projektet er modificeret, kompileres makefilen og regenererer kun den del uden at skulle regenerere hele projektet.
C ++ Makefile giver os mulighed for at repræsentere projektet systematisk og effektivt og derved gøre det mere læsbart og let at debugge.
I denne C ++ Makefile-tutorial har vi set makefile og lavet værktøjer i detaljer. Vi har også diskuteret, hvordan man skriver en makefile fra bunden.
=> Tjek den perfekte C ++ træningsvejledning her.
Anbefalet læsning
- 70+ BEST C ++ tutorials til at lære C ++ programmering GRATIS
- Dev C ++ IDE: Installation, funktioner og C ++ udvikling
- En komplet oversigt over C ++
- VBScript-filobjekter: CopyFile, DeleteFile, OpenTextFile, Læs og skriv tekstfil
- Python filhåndteringsvejledning: Sådan oprettes, åbnes, læses, skrives
- Unix-filsystemkommandoer Touch, Cat, Cp, Mv, Rm, Mkdir (del B)
- 12 bedste Python IDE'er og kodeditorer i 2021
- Top 15 bedste gratis kodeditorer til perfekt kodningsoplevelse