Forstå Makefile-syntaks: Vanlige problemer og løsninger (inkludert 'Manglende operatør' og 'Inngangspunkt ikke funnet')

Forsta Makefile Syntaks Vanlige Problemer Og Losninger Inkludert Manglende Operator Og Inngangspunkt Ikke Funnet



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.

#include
int 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.