Akkurat som en kodefil inneholder én eller flere kodelinjer som innhold for å gjøre det verdt det, er den grunnleggende makefilen konstruert ved hjelp av variabler, regler og mål. Annet enn det er det også andre faktorer som er nødvendige for å lage en komplett makefil uten problemer. I denne veiledningen vil vi diskutere den grunnleggende makefile-syntaksen og de vanlige problemene mens vi skriver en makefil og gi løsninger for å løse disse problemene.
Forstå Makefile Basic-syntaksen
For å komme i gang med å lage en makefil, forklarer vi de grunnleggende egenskapene til en makefil via makefile-kodeeksemplet. Det er nødvendig å inkludere følgende syntaksegenskaper i makefilinnholdet for å få en kjørbar fil:
Variabel s: En grunnleggende data som lagrer objekter som er nødvendige for å brukes i makefilen. Disse variablene brukes til å spesifisere en kompilator, flagg, kildefiler, objektfiler og målfiler. Innenfor følgende eksempelmakefil er det totalt fem variabler som er CXX (for å angi en C++-kompilator), CXXFLAGSc (kompilatorflagg), TARGET (for å angi et kjørbart målfilnavn), SRCS (for å angi en kildekodefil) , OBJS (for å inneholde objektfilene som genereres via kildekodefilen).
Mål: En forventet utgang å bygge fra kilden. Det kan være en målfil eller et hvilket som helst symbolsk navn: 'all' er standardmålet som skal bygges via 'TARGET'-variabelen, '$TARGET' avhenger av 'OBJS'-variablene, og 'clean' target fjerner målet og objektfiler fra arbeidskatalogen.
Regler og byggekommandoer: Sett med grunnleggende instruksjoner som skal utføres for å lage et mål fra kildefilen eller avhengigheter. For eksempel viser regelen '%.o: %.cpp' at filen med filtypen 'cpp' brukes til å lage en objektfil med filtypen 'o' mens begge filene inneholder samme navn. På den annen side, byggkommandoen $(CXX) $(CXXFLAGS) -o $(MÅL) $(OBJS) brukes til å koble en objektfil og en ny målfil sammen. På samme måte bygger kommandoen $(CXX) $(CXXFLAGS) -c $< -o $@ kompilerer kildefilen til en objektfil.
Avhengigheter: Avhengigheter er alltid der når du vil lage en makefil. For eksempel avhenger 'alle'-målet av 'TARGET'-variabelen mens 'TARGET' avhenger av 'OBJS'-variabelen. Samtidig er 'OBJS'-variabelen avhengig av kildefilen via 'SRCS'-variabelen.
Kommentarer: Menneskeforståelige instruksjoner brukes vanligvis for å forklare formålet med kodelinjen i tilfelle du bruker en fil etter lang tid. I den følgende makefilen bruker vi kommentarene som starter med '#'-tegnet for å forklare hver linje.
CXX = g++
CXXFLAGGER = -std =c++ elleve -Vegg
MÅL = Ny
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
alle: $ ( MÅL )
$ ( MÅL ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGGER ) -O $ ( MÅL ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGGER ) -c $ < -O $ @
ren:
rm -f $ ( MÅL ) $ ( OBJS )
Vanlige problemer og løsninger
Mens du skriver hvilken som helst makefil, er det nødvendig å vurdere hver minste detalj for å få ønsket utgang på slutten. Noen vanlige problemer støter ofte på av brukere når de oppretter en makefil. I denne delen vil vi diskutere disse problemene og foreslå mulige løsninger som følger:
1: Bruker ikke variabler
Å bruke variablene i en makefil er et must-have da det kreves for å sette kompilatorer, mål, kildefiler, etc. Det vanligste problemet som kan oppstå er å ikke bruke noen variabel i en makefil. Sørg derfor for å bruke de essensielle variablene som CXX, CXXFLAGSc (kompilatorflagg), TARGET, SRCS og OBJS i forrige eksempelmakefil.
2: Manglende skilletegn
Når du skriver en make-fil, er det nødvendig å vurdere innrykk-reglene veldig nøye fordi bruk av mellomrom i stedet for tabulatorer vil føre deg til et problem med 'manglende skilletegn' under utførelsen av 'make'-instruksjonen. For eksempel legger vi til mellomrommet i starten av en regel på linje 13 og fjerner fanen.
$ ( MÅL ) : $ ( OBJS )$ ( CXX ) $ ( CXXFLAGGER ) -O $ ( MÅL ) $ ( OBJS )
Ved kjøring av 'make'-spørringen, får vi en 'manglende separator'-feil på linje 13, og filen slutter å kjøre. For å unngå dette problemet, sørg for å bruke 'tab' i stedet for mellomrom.
gjøre
For å unngå dette problemet, sørg for å bruke 'tab' i stedet for mellomrom som vist i følgende bilde:
$ ( MÅL ) : $ ( OBJS )$ ( CXX ) $ ( CXXFLAGGER ) -O $ ( MÅL ) $ ( OBJS )
3: 'Inngangspunkt ikke funnet'-problem
Denne feilen oppstår for det meste på grunn av kildefilen og ikke på grunn av makefilen som når du savner bruken av 'main()'-funksjonen i kildekodefilen. For eksempel erstatter vi main() funksjonsdefinisjonen med en enkel brukerdefinert funksjonsdeklarasjon.
#includeint show ( ) {
røye v;
std::cout << 'Skriv inn en verdi: ' ;
std::cin >> i;
std::cout << i << std::endl;
komme tilbake 0 ;
}
Ved å utføre 'make'-instruksjonen på kommandoprompten til Windows, møter vi den 'udefinerte referansen til 'WinMain''. Dette er fordi kompilatoren ikke finner noe inngangspunkt for å begynne å kjøre C++-filen. For å løse dette, erstatt 'show' med 'main'.
4: Bruk av feil utvidelser
Noen ganger kan en bruker utilsiktet bruke feil utvidelser for en kildefil som skal brukes i makefilen. Bruk av feil utvidelse vil føre til kjøretidsfeil, dvs. ingen regel for å lage et mål. Vi lager en makefil for å bygge den kjørbare og objektfilen for C++-filen. På den syvende linjen gir vi kildefilen 'c'-utvidelsen.
CXX := g++CXXFLAGGER := -std =c++ elleve -Vegg
MÅL = ny
SRCS = hoved.c
OBJS = $ ( SRCS:.cpp=.o )
Alle: $ ( MÅL )
$ ( MÅL ) : $ ( OBJS )
Å kjøre 'make'-instruksjonen fører oss til feilen 'Ingen regel for å lage mål 'main.c''. For å unngå dette problemet, sørg for å bruke riktig kildefiltype.
gjøre
5: Manglende avhengigheter
Mens du skriver en makefil, bør du inkludere alle avhengighetene for en kildefil for å få ønsket utgang. For eksempel bruker vår C++-kodefil 'myheader.h'-filen som sin avhengighet. Derfor nevner vi det i C++-kodefilen som følger:
#include#inkluder «myheader.h»
int show ( ) {
røye v;
std::cout << 'Skriv inn en verdi: ' ;
std::cin >> i;
std::cout << i << std::endl;
komme tilbake 0 ;
}
Innenfor makefilen ignorerer vi med vilje bruken av 'myheader.h'-filen innenfor byggeregelen som er skrevet på linje 9.
% .O: % .cpp$ ( CXX ) $ ( CXXFLAGGER ) -c $ < -O $ @
Nå, mens vi bruker 'lag'-instruksjonen, møter vi feilen 'Ingenting å gjøre for 'alle''.
gjøre% .O: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGGER ) -c $ < -O $ @
For å unngå det nevnte problemet og kjøre kildekoden vellykket, nevne 'myheader.h' filnavnet på den niende linjen i makefilen som vist i følgende:
Konklusjon
I denne veiledningen forklarte vi grundig syntaksen til makefile ved å bruke dets nødvendige innhold som variabler, byggekommandoer, regler osv. Kodeeksemplet er inkludert for å utdype syntaksen klarere. Til slutt diskuterte vi noen vanlige problemer og deres løsninger som en bruker kan støte på mens han oppretter en makefil.