Pag-unawa sa Makefile Syntax: Mga Karaniwang Isyu at Solusyon (Kabilang ang 'Nawawalang Operator' at 'Entry Point Not Found')

Pag Unawa Sa Makefile Syntax Mga Karaniwang Isyu At Solusyon Kabilang Ang Nawawalang Operator At Entry Point Not Found



Tulad ng isang code file na naglalaman ng isa o higit pang mga linya ng code bilang nilalaman upang maging kapaki-pakinabang, ang pangunahing makefile ay binuo gamit ang mga variable, panuntunan, at target. Maliban doon, may iba pang mga kadahilanan din na kinakailangan upang makagawa ng isang kumpletong makefile nang walang anumang mga isyu. Sa gabay na ito, tatalakayin natin ang pangunahing syntax ng makefile at ang mga karaniwang isyu habang nagsusulat ng makefile at magbibigay ng mga solusyon upang malutas ang mga isyung iyon.

Pag-unawa sa Makefile Basic Syntax

Upang makapagsimula sa paglikha ng isang makefile, ipinapaliwanag namin ang mga pangunahing katangian ng isang makefile sa pamamagitan ng halimbawa ng makefile code. Kinakailangang isama ang mga sumusunod na katangian ng syntax sa nilalaman ng makefile upang makakuha ng executable na file:







Variable s: Isang pangunahing data na nag-iimbak ng mga bagay na kinakailangan para magamit sa makefile. Ang mga variable na ito ay ginagamit upang tukuyin ang isang compiler, mga flag, source file, object file, at target na file. Sa loob ng sumusunod na sample na makefile, mayroong kabuuang limang variable na CXX (upang magtakda ng C++ compiler), CXXFLAGSc (mga flag ng compiler), TARGET (upang magtakda ng target na executable na pangalan ng file), SRCS (upang magtakda ng source code file) , OBJS (upang maglaman ng mga object file na nabuo sa pamamagitan ng source code file).



Mga target: Isang inaasahang output na bubuo mula sa pinagmulan. Maaari itong maging target na file o anumang simbolikong pangalan: 'lahat' ang default na target na dapat gawin sa pamamagitan ng variable na 'TARGET', '$TARGET' ay depende sa mga variable na 'OBJS', at ang 'clean' na target ay nag-aalis ng target at object file mula sa gumaganang direktoryo.



Mga Panuntunan at Build Command: Set ng mga pangunahing tagubilin na isasagawa upang lumikha ng target mula sa source file o mga dependency. Halimbawa, ipinapakita ng panuntunang '%.o: %.cpp' na ang file na may extension na 'cpp' ay ginagamit upang lumikha ng object file na may extension na 'o' habang ang parehong mga file ay naglalaman ng parehong pangalan. Sa kabilang banda, ang build command $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) ay ginagamit upang i-link ang isang object file at isang bagong target na file nang magkasama. Sa parehong paraan, ang build command $(CXX) $(CXXFLAGS) -c $< -o $@ kino-compile ang source file sa isang object file.





Dependencies: Ang mga dependency ay palaging nandiyan kapag nais mong lumikha ng isang makefile. Halimbawa, ang 'lahat' na target ay nakadepende sa 'TARGET' na variable habang ang 'TARGET' ay nakadepende sa 'OBJS' na variable. Kasabay nito, nakadepende ang variable na 'OBJS' sa source file sa pamamagitan ng variable na 'SRCS'.

Mga komento: Karaniwang ginagamit ang mga tagubiling nauunawaan ng tao upang ipaliwanag ang layunin ng linya ng code kung sakaling gumagamit ka ng file pagkatapos ng mahabang panahon. Sa sumusunod na makefile, ginagamit namin ang mga komento na nagsisimula sa sign na '#' upang ipaliwanag ang bawat linya.



CXX = g++
CXXFLAGS = -std =c++ labing-isa -Pader
TARGET = Bago
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
lahat: $ ( TARGET )
$ ( TARGET ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( TARGET ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
malinis:
rm -f $ ( TARGET ) $ ( OBJS )

Mga Karaniwang Isyu at Solusyon

Habang nagsusulat ng anumang makefile, kinakailangang isaalang-alang ang bawat menor de edad na detalye upang makuha ang nais na output sa dulo. Ang ilang karaniwang isyu ay madalas na nakakaharap ng mga user habang gumagawa ng makefile. Sa loob ng seksyong ito, tatalakayin natin ang mga isyung iyon at magmumungkahi ng mga posibleng solusyon gaya ng sumusunod:

1: Hindi Paggamit ng mga Variable

Ang paggamit ng mga variable sa isang makefile ay kailangang-kailangan dahil kinakailangan upang itakda ang mga compiler, target, source file, atbp. Ang pinakakaraniwang isyu na maaaring makaharap ay ang hindi paggamit ng anumang variable sa isang makefile. Samakatuwid, tiyaking gamitin ang mahahalagang variable tulad ng CXX, CXXFLAGSc(compiler flags), TARGET, SRCS, at OBJS sa nakaraang sample na makefile.

2: Nawawalang Isyu sa Separator

Habang nagsusulat ng isang makefile, kinakailangang isaalang-alang ang mga panuntunan ng indentation nang maingat dahil ang paggamit ng mga puwang sa halip na mga tab ay magdadala sa iyo sa isang isyu na 'nawawalang separator' sa panahon ng pagpapatupad ng 'make' na pagtuturo. Halimbawa, idinaragdag namin ang espasyo sa simula ng isang panuntunan sa linya 13 at alisin ang tab.

$ ( TARGET ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( TARGET ) $ ( OBJS )

Sa pagpapatupad ng query na 'gumawa', nakakakuha kami ng error na 'nawawalang separator' sa linya 13, at huminto sa pagtakbo ang file. Para maiwasan ang isyung ito, tiyaking gumamit ng “tab” sa halip na mga espasyo.

gumawa

Upang maiwasan ang isyung ito, tiyaking gumamit ng 'tab' sa halip na mga puwang tulad ng inilalarawan sa sumusunod na larawan:

$ ( TARGET ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( TARGET ) $ ( OBJS )

3: Isyu sa 'Entry Point Not Found'.

Ang error na ito ay kadalasang nangyayari dahil sa source file at hindi dahil sa makefile tulad ng kapag napalampas mo ang paggamit ng 'main()' function sa source code file. Halimbawa, pinapalitan namin ang pangunahing() kahulugan ng function ng isang simpleng deklarasyon ng function na tinukoy ng gumagamit.

#include
int palabas ( ) {
char v;
std::cout << 'Magpasok ng halaga: ' ;
std::cin >> sa;
std::cout << sa << std::endl;
bumalik 0 ;
}

Sa pag-execute ng 'make' instruction sa command prompt ng Windows, nakatagpo namin ang 'undefined reference to 'WinMain''. Ito ay dahil ang compiler ay hindi nakakahanap ng anumang entry point upang simulan ang pagpapatupad ng C++ file. Para maresolba ito, palitan ang “show” ng “main”.

4: Paggamit ng Mga Maling Extension

Minsan, ang isang user ay maaaring hindi sinasadyang gumamit ng mga maling extension para sa isang source file na gagamitin sa makefile. Ang paggamit ng maling extension ay hahantong sa mga error sa run-time, ibig sabihin, walang panuntunan para gumawa ng target. Gumagawa kami ng makefile para buuin ang executable at object file para sa C++ file. Sa ikapitong linya, ibinibigay namin ang source file na may extension na 'c'.

CXX := g++
CXXFLAGS := -std =c++ labing-isa -Pader
TARGET = bago
SRCS = pangunahing.c
OBJS = $ ( SRCS:.cpp=.o )
Lahat: $ ( TARGET )
$ ( TARGET ) : $ ( OBJS )

Ang pagpapatakbo ng pagtuturo na 'gumawa' ay humahantong sa amin sa error na 'Walang panuntunan upang gawin ang target na 'main.c''. Upang maiwasan ang isyung ito, tiyaking gamitin ang tamang extension ng source file.

gumawa

5: Nawawalang Dependencies

Habang nagsusulat ng makefile, dapat mong isama ang lahat ng mga dependency para sa isang source file upang makuha ang nais na output. Halimbawa, ginagamit ng aming C++ code file ang 'myheader.h' file bilang dependency nito. Samakatuwid, binanggit namin ito sa C++ code file tulad ng sumusunod:

#include
#include “myheader.h”
int palabas ( ) {
char v;
std::cout << 'Magpasok ng halaga: ' ;
std::cin >> sa;
std::cout << sa << std::endl;
bumalik 0 ;
}

Sa loob ng makefile, sinasadya naming huwag pansinin ang paggamit ng 'myheader.h' na file sa loob ng panuntunan sa pagbuo na nakasulat sa linya 9.

% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @

Ngayon, habang ginagamit ang pagtuturo na 'gumawa', nakatagpo kami ng error na 'Walang dapat gawin para sa 'lahat''.

gumawa

% .O: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @

Upang maiwasan ang nasabing isyu at matagumpay na patakbuhin ang source code, banggitin ang 'myheader.h' filename sa ika-siyam na linya ng makefile tulad ng inilalarawan sa sumusunod:

Konklusyon

Sa loob ng gabay na ito, lubusan naming ipinaliwanag ang syntax ng makefile gamit ang mga kinakailangang nilalaman nito tulad ng mga variable, build command, panuntunan, atbp. Ang halimbawa ng code ay kasama para mas malinaw na ipaliwanag ang syntax. Sa huli, tinalakay namin ang ilang regular na isyu at ang kanilang mga solusyon na maaaring makaharap ng isang user habang gumagawa ng makefile.