Makefile sintakses izpratne: izplatītas problēmas un risinājumi (tostarp “Trūkstošais operators” un “Ieejas punkts nav atrasts”)

Makefile Sintakses Izpratne Izplatitas Problemas Un Risinajumi Tostarp Trukstosais Operators Un Ieejas Punkts Nav Atrasts



Tāpat kā koda failā ir viena vai vairākas koda rindiņas, lai tas būtu vērtīgs, pamata makefile tiek veidota, izmantojot mainīgos, noteikumus un mērķus. Papildus tam ir arī citi faktori, kas ir nepieciešami, lai bez problēmām izveidotu pilnīgu makefile. Šajā rokasgrāmatā mēs apspriedīsim makefile pamata sintakse un izplatītākās problēmas, rakstot makefile, un sniegsim risinājumus šo problēmu risināšanai.

Izpratne par Makefile pamata sintakse

Lai sāktu ar makefile izveidi, mēs izskaidrojam makefile pamatīpašības, izmantojot makefile koda piemēru. Lai iegūtu izpildāmo failu, makefile saturā ir jāiekļauj šādi sintakses rekvizīti:





Mainīgs s: pamatdati, kas glabā objektus, kas ir nepieciešami, lai tos izmantotu makefile. Šie mainīgie tiek izmantoti, lai norādītu kompilatoru, karogus, avota failus, objektu failus un mērķa failus. Nākamajā makefile paraugā kopā ir pieci mainīgie, kas ir CXX (lai iestatītu C++ kompilatoru), CXXFLAGSc (kompilatora karodziņi), TARGET (lai iestatītu mērķa izpildāmā faila nosaukumu), SRCS (lai iestatītu avota koda failu). , OBJS (lai saturētu objektu failus, kas tiek ģenerēti, izmantojot avota koda failu).



Mērķi: Paredzamā izvade, kas jāveido no avota. Tas var būt mērķa fails vai jebkurš simbolisks nosaukums: “viss” ir noklusējuma mērķis, kas jāveido, izmantojot mainīgo “TARGET”, “$TARGET” ir atkarīgs no “OBJS” mainīgajiem, un “clean” mērķis noņem mērķi un objektu faili no darba direktorija.



Noteikumi un veidošanas komandas: Pamatinstrukciju kopa, kas jāizpilda, lai izveidotu mērķi no avota faila vai atkarībām. Piemēram, noteikums “%.o: %.cpp” parāda, ka fails ar paplašinājumu “cpp” tiek izmantots, lai izveidotu objekta failu ar paplašinājumu “o”, bet abiem failiem ir vienāds nosaukums. No otras puses, būvniecības komanda $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) tiek izmantots, lai kopā saistītu objekta failu un jaunu mērķa failu. Tādā pašā veidā būvniecības komanda $(CXX) $(CXXFLAGS) -c $< -o $@ kompilē avota failu objekta failā.





Atkarības: Atkarības vienmēr pastāv, kad vēlaties izveidot makefile. Piemēram, mērķis “viss” ir atkarīgs no mainīgā “TARGET”, savukārt “TARGET” ir atkarīgs no mainīgā “OBJS”. Tajā pašā laikā mainīgais “OBJS” ir atkarīgs no avota faila, izmantojot mainīgo “SRCS”.

Komentāri: Cilvēkam saprotamas instrukcijas parasti tiek izmantotas, lai izskaidrotu koda rindas mērķi gadījumā, ja pēc ilga laika izmantojat failu. Nākamajā makefailā mēs izmantojam komentārus, kas sākas ar zīmi “#”, lai izskaidrotu katru rindiņu.



CXX = g++
CXXFLAGS = -std =c++ vienpadsmit -Siena
MĒRĶIS = jauns
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
visi: $ ( MĒRĶIS )
$ ( MĒRĶIS ) : $ ( OBJS )
$ ( CXX ) $ ( CXXKAROGI ) -O $ ( MĒRĶIS ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXKAROGI ) -c $ < -O $ @
tīrs:
rm -f $ ( MĒRĶIS ) $ ( OBJS )

Kopīgas problēmas un risinājumi

Rakstot jebkuru makefilu, ir jāņem vērā katra mazākā detaļa, lai beigās iegūtu vēlamo rezultātu. Veidojot makefile, lietotāji bieži saskaras ar dažām izplatītām problēmām. Šajā sadaļā mēs apspriedīsim šos jautājumus un ieteiksim iespējamos risinājumus, kā norādīts tālāk.

1: neizmanto mainīgos

Mainīgo izmantošana makefile ir obligāta, jo tas ir nepieciešams, lai iestatītu kompilatorus, mērķi, avota failus utt. Visbiežāk sastopamā problēma, ar kuru var saskarties, ir neviena mainīgā neizmantošana makefile. Tāpēc iepriekšējā makefile paraugā noteikti izmantojiet būtiskos mainīgos, piemēram, CXX, CXXFLAGSc (kompilatora karodziņi), TARGET, SRCS un OBJS.

2. Trūkst atdalītāja problēma

Rakstot makefile, ir ļoti rūpīgi jāapsver atkāpes noteikumi, jo, izmantojot atstarpes, nevis tabulēšanas taustiņus, instrukcijas 'make' izpildes laikā tiks parādīta problēma 'trūkst atdalītāja'. Piemēram, mēs pievienojam atstarpi kārtulas sākumā 13. rindiņā un noņemam cilni.

$ ( MĒRĶIS ) : $ ( OBJS )
$ ( CXX ) $ ( CXXKAROGI ) -O $ ( MĒRĶIS ) $ ( OBJS )

Izpildot vaicājumu “make”, 13. rindiņā tiek parādīta kļūda “trūkst atdalītāja”, un fails pārstāj darboties. Lai izvairītos no šīs problēmas, atstarpes vietā noteikti izmantojiet “tabulēšanas taustiņu”.

veidot

Lai izvairītos no šīs problēmas, noteikti izmantojiet 'tabulēšanas taustiņu', nevis atstarpes, kā parādīts šajā attēlā:

$ ( MĒRĶIS ) : $ ( OBJS )
$ ( CXX ) $ ( CXXKAROGI ) -O $ ( MĒRĶIS ) $ ( OBJS )

3: problēma “Ieejas punkts nav atrasts”.

Šī kļūda galvenokārt rodas avota faila dēļ, nevis makefile dēļ, piemēram, ja avota koda failā nav izmantota funkcija “main()”. Piemēram, mēs aizstājam funkcijas main() definīciju ar vienkāršu lietotāja definētu funkcijas deklarāciju.

#include
starpšovs ( ) {
char v;
std::cout << 'Ievadiet vērtību:' ;
std::cin >> iekšā;
std::cout << iekšā << std::endl;
atgriezties 0 ;
}

Izpildot instrukciju “make” Windows komandu uzvednē, mēs sastopam “nedefinētu atsauci uz “WinMain”. Tas ir tāpēc, ka kompilators neatrod nevienu ieejas punktu, lai sāktu C++ faila izpildi. Lai to atrisinātu, aizstājiet “show” ar “main”.

4: nepareizu paplašinājumu izmantošana

Dažreiz lietotājs var netīši izmantot nepareizus paplašinājumus avota failam, kas tiks izmantots makefile. Nepareiza paplašinājuma izmantošana radīs izpildlaika kļūdas, t.i., nebūs noteikumu, kā izveidot mērķi. Mēs izveidojam makefile, lai izveidotu izpildāmo un objekta failu C++ failam. Septītajā rindā mēs nodrošinām avota failu ar paplašinājumu “c”.

CXX := g++
CXXFLAGS := -std =c++ vienpadsmit -Siena
MĒRĶIS = jauns
SRCS = galvenais.c
OBJS = $ ( SRCS:.cpp=.o )
Visi: $ ( MĒRĶIS )
$ ( MĒRĶIS ) : $ ( OBJS )

Palaižot instrukciju “make”, tiek parādīta kļūda “Nav kārtulas, lai izveidotu mērķi “main.c”. Lai izvairītos no šīs problēmas, noteikti izmantojiet pareizo avota faila paplašinājumu.

veidot

5: trūkstošo atkarību

Rakstot makefile, jums jāiekļauj visas avota faila atkarības, lai iegūtu vēlamo izvadi. Piemēram, mūsu C++ koda fails izmanto failu “myheader.h” kā savu atkarību. Tāpēc mēs to pieminam C++ koda failā šādi:

#include
#include “myheader.h”
starpšovs ( ) {
char v;
std::cout << 'Ievadiet vērtību:' ;
std::cin >> iekšā;
std::cout << iekšā << std::endl;
atgriezties 0 ;
}

Makefile mēs apzināti ignorējam faila “myheader.h” izmantošanu būvēšanas noteikumā, kas ir rakstīts 9. rindiņā.

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

Tagad, izmantojot instrukciju “make”, mēs saskaramies ar kļūdu “Nekas jādara visiem”.

veidot

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

Lai izvairītos no minētās problēmas un veiksmīgi palaistu avota kodu, makefile devītajā rindā norādiet faila nosaukumu “myheader.h”, kā parādīts tālāk:

Secinājums

Šajā rokasgrāmatā mēs rūpīgi izskaidrojām makefile sintaksi, izmantojot tās nepieciešamo saturu, piemēram, mainīgos, veidošanas komandas, noteikumus utt. Koda piemērs ir iekļauts, lai skaidrāk izstrādātu sintaksi. Noslēgumā mēs apspriedām dažas regulāras problēmas un to risinājumus, ar kuriem lietotājs var saskarties, veidojot makefile.