Makefile'i süntaksi mõistmine: levinumad probleemid ja lahendused (sh 'Puuduv operaator' ja 'Sisenemispunkti ei leitud')

Makefile I Suntaksi Moistmine Levinumad Probleemid Ja Lahendused Sh Puuduv Operaator Ja Sisenemispunkti Ei Leitud



Nii nagu koodifail sisaldab üht või mitut koodirida, et see oleks kasulik, koostatakse põhifail muutujate, reeglite ja sihtmärkide abil. Peale selle on ka muid tegureid, mis on vajalikud täieliku makefile ilma probleemideta loomiseks. Selles juhendis käsitleme makefile'i põhisüntaksit ja tavalisi probleeme make-faili kirjutamisel ning pakume lahendusi nende probleemide lahendamiseks.

Makefile'i põhisüntaksi mõistmine

Makefile'i loomise alustamiseks selgitame makefile'i koodinäite kaudu makefile'i põhiomadusi. Käivitatava faili saamiseks on vaja makefile'i sisusse lisada järgmised süntaksi atribuudid:







Muutuv s: põhiandmed, mis salvestavad makefile'is kasutamiseks vajalikke objekte. Neid muutujaid kasutatakse kompilaatori, lippude, lähtefailide, objektifailide ja sihtfailide määramiseks. Järgmises makefile'i näidises on kokku viis muutujat, milleks on CXX (C++ kompilaatori määramiseks), CXXFLAGSc (kompilaatori lipud), TARGET (sihtkäivitava faili nime määramiseks), SRCS (lähtekoodifaili määramiseks) , OBJS (sisaldab lähtekoodifaili kaudu genereeritud objektifaile).



Sihtmärgid: Eeldatav väljund allikast loomiseks. See võib olla sihtfail või mis tahes sümboolne nimi: 'all' on vaikimisi sihtmärk, mis tuleks luua muutuja 'TARGET' kaudu, '$TARGET' sõltub muutujatest 'OBJS' ja 'clean' sihtmärk eemaldab sihtmärgi ja objektifailid töökataloogist.



Reeglid ja ehituskäsud: Põhijuhiste komplekt, mis tuleb käivitada sihtmärgi loomiseks lähtefailist või sõltuvustest. Näiteks reegel “%.o: %.cpp” näitab, et “cpp” laiendiga faili kasutatakse laiendiga “o” objektifaili loomiseks, samas kui mõlemad failid sisaldavad sama nime. Teisest küljest ehitamiskäsk $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) kasutatakse objektifaili ja uue sihtfaili ühendamiseks. Samamoodi ehitamiskäsk $(CXX) $(CXXFLAGS) -c $< -o $@ kompileerib lähtefaili objektifailiks.





Sõltuvused: Kui soovite makefaili luua, on sõltuvused alati olemas. Näiteks sõltub sihtmärk „kõik” muutujast „TARGET”, samas kui „TARGET” sõltub muutujast „OBJS”. Samal ajal sõltub muutuja 'OBJS' muutuja 'SRCS' kaudu lähtefailist.

Kommentaarid: Tavaliselt kasutatakse inimarusaadavaid juhiseid koodirea eesmärgi selgitamiseks juhuks, kui kasutate faili pika aja pärast. Järgmises make-failis kasutame iga rea ​​selgitamiseks #-märgiga algavaid kommentaare.



CXX = g++
CXXFLAGS = -std =c++ üksteist - Sein
SIHT = uus
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
kõik: $ ( SIHT )
$ ( SIHT ) : $ ( OBJS )
$ ( CXX ) $ ( CXXLIPUD ) -O $ ( SIHT ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXLIPUD ) -c $ < -O $ @
puhas:
rm -f $ ( SIHT ) $ ( OBJS )

Levinud probleemid ja lahendused

Iga make-faili kirjutamisel on vaja arvestada iga väiksema detailiga, et lõpuks saada soovitud väljund. Kasutajad kogevad makefaili loomisel sageli mõningaid levinud probleeme. Selles jaotises käsitleme neid probleeme ja pakume välja võimalikud lahendused järgmiselt.

1: ei kasuta muutujaid

Muutujate kasutamine makefile'is on kohustuslik, kuna see on vajalik kompilaatorite, sihtmärgi, lähtefailide jne määramiseks. Kõige tavalisem probleem, millega võib kokku puutuda, on muutujate mittekasutamine makefile'is. Seetõttu kasutage eelmises proovifailis kindlasti olulisi muutujaid, nagu CXX, CXXFLAGSc (kompilaatori lipud), TARGET, SRCS ja OBJS.

2: Puudub eraldaja probleem

Makefile'i kirjutamisel tuleb väga tähelepanelikult arvestada treppimise reeglitega, sest tühikute kasutamine tabeldusmärkide asemel viib käskluse 'make' täitmisel 'puuduva eraldaja' probleemini. Näiteks lisame reale 13 reegli algusesse tühiku ja eemaldame vahekaardi.

$ ( SIHT ) : $ ( OBJS )
$ ( CXX ) $ ( CXXLIPUD ) -O $ ( SIHT ) $ ( OBJS )

Päringu 'make' täitmisel saame real 13 veateate 'puuduv eraldaja' ja fail lakkab töötamast. Selle probleemi vältimiseks kasutage tühikute asemel kindlasti vahekaarti.

tegema

Selle probleemi vältimiseks kasutage järgmisel pildil näidatud tühikute asemel kindlasti vahekaarti:

$ ( SIHT ) : $ ( OBJS )
$ ( CXX ) $ ( CXXLIPUD ) -O $ ( SIHT ) $ ( OBJS )

3: probleem 'Sisenemispunkti ei leitud'.

See tõrge ilmneb enamasti lähtefaili, mitte makefile tõttu, nagu siis, kui jätate lähtekoodifailis kasutamata funktsiooni 'main()'. Näiteks asendame funktsiooni main() definitsiooni lihtsa kasutaja määratud funktsioonideklaratsiooniga.

#include
int show ( ) {
char v;
std::cout << 'Sisestage väärtus:' ;
std::cin >> sisse;
std::cout << sisse << std::endl;
tagasi 0 ;
}

Käsu 'make' täitmisel Windowsi käsureal näeme 'määratlemata viidet 'WinMainile'. Selle põhjuseks on asjaolu, et kompilaator ei leia ühtegi sisestuspunkti C++-faili käivitamiseks. Selle lahendamiseks asenda 'show' sõnaga 'main'.

4: valede laiendite kasutamine

Mõnikord võib kasutaja makefile'is kasutatava lähtefaili jaoks tahtmatult kasutada valesid laiendusi. Vale laienduse kasutamine toob kaasa käitusaja tõrkeid, st sihtmärgi loomise reeglit pole. Loome make-faili, et luua C++-faili käivitatav ja objektfail. Seitsmendal real esitame lähtefaili laiendiga 'c'.

CXX := g++
CXXFLAGS := -std =c++ üksteist - Sein
SIHT = uus
SRCS = main.c
OBJS = $ ( SRCS:.cpp=.o )
Kõik: $ ( SIHT )
$ ( SIHT ) : $ ( OBJS )

Käsu „make” käivitamine viib meid veani „Ei ole reeglit sihtmärgi main.c muutmiseks”. Selle probleemi vältimiseks kasutage kindlasti õiget lähtefaili laiendit.

tegema

5: puuduvad sõltuvused

Makefaili kirjutamisel peaksite soovitud väljundi saamiseks kaasama kõik lähtefaili sõltuvused. Näiteks meie C++ koodifail kasutab oma sõltuvusena faili 'myheader.h'. Seetõttu mainime seda C++ koodifailis järgmiselt:

#include
#include 'myheader.h'
int show ( ) {
char v;
std::cout << 'Sisestage väärtus:' ;
std::cin >> sisse;
std::cout << sisse << std::endl;
tagasi 0 ;
}

Makefile'is eirame me tahtlikult faili „myheader.h” kasutamist ehitusreeglis, mis on kirjutatud real 9.

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

Nüüd, kui kasutame käsku 'make', ilmneb viga 'Kõigi jaoks pole midagi teha'.

tegema

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

Nimetatud probleemi vältimiseks ja lähtekoodi edukaks käitamiseks mainige makefile üheksandal real failinime 'myheader.h', nagu on näidatud järgmiselt:

Järeldus

Selles juhendis selgitasime põhjalikult makefile'i süntaksit, kasutades selle vajalikku sisu, nagu muutujad, ehituskäsud, reeglid jne. Koodinäide on lisatud süntaksi selgemaks täpsustamiseks. Lõpuks arutasime mõningaid tavalisi probleeme ja nende lahendusi, millega kasutaja makefile'i loomisel kokku puutub.