Makefile sintaksės supratimas: dažnos problemos ir sprendimai (įskaitant „Trūksta operatoriaus“ ir „Įėjimo taškas nerastas“)

Makefile Sintakses Supratimas Daznos Problemos Ir Sprendimai Iskaitant Truksta Operatoriaus Ir Iejimo Taskas Nerastas



Kaip ir kodo faile yra viena ar daugiau kodo eilučių, kad būtų naudinga, taip ir pagrindinis makefile yra kuriamas naudojant kintamuosius, taisykles ir tikslus. Be to, yra ir kitų veiksnių, kurių reikia norint sukurti pilną maketą be jokių problemų. Šiame vadove aptarsime pagrindinę makefile sintaksę ir įprastas problemas rašant makefile bei pateiksime sprendimus, kaip tas problemas išspręsti.

Pagrindinės Makefile sintaksės supratimas

Norėdami pradėti kurti makefile, mes paaiškiname pagrindines makefile savybes per makefile kodo pavyzdį. Norint gauti vykdomąjį failą, į makefile turinį būtina įtraukti šias sintaksės ypatybes:







Kintamasis s: pagrindiniai duomenys, kuriuose saugomi objektai, kuriuos reikia naudoti makefile. Šie kintamieji naudojami kompiliatoriui, vėliavėlėms, šaltinio failams, objektų failams ir tiksliniams failams nurodyti. Šiame makefile pavyzdyje iš viso yra penki kintamieji: CXX (nustatyti C++ kompiliatorių), CXXFLAGSc (kompiliatoriaus vėliavėlės), TARGET (nustatyti tikslinio vykdomojo failo pavadinimą), SRCS (nustatyti šaltinio kodo failą). , OBJS (kad būtų objektų failai, sugeneruoti naudojant šaltinio kodo failą).



Tikslai: Numatoma išvestis, kuri bus sukurta iš šaltinio. Tai gali būti tikslinis failas arba bet koks simbolinis pavadinimas: „visi“ yra numatytasis tikslas, kurį reikia sukurti naudojant „TARGET“ kintamąjį, „$TARGET“ priklauso nuo „OBJS“ kintamųjų, o „clean“ tikslas pašalina tikslą ir objektų failus iš darbo katalogo.



Taisyklės ir kūrimo komandos: Pagrindinių instrukcijų rinkinys, kuris turi būti vykdomas norint sukurti tikslą iš šaltinio failo arba priklausomybių. Pavyzdžiui, taisyklė „%.o: %.cpp“ rodo, kad failas su plėtiniu „cpp“ naudojamas objekto failui su plėtiniu „o“ sukurti, o abu failai turi tą patį pavadinimą. Kita vertus, kūrimo komanda $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) naudojamas susieti objekto failą ir naują tikslinį failą. Lygiai taip pat kūrimo komanda $(CXX) $(CXXFLAGS) -c $< -o $@ sukompiliuoja šaltinio failą į objekto failą.





Priklausomybės: Priklausomybės visada yra, kai norite sukurti make-file. Pavyzdžiui, tikslas „visi“ priklauso nuo „TARGET“ kintamojo, o „TARGET“ priklauso nuo „OBJS“ kintamojo. Tuo pačiu metu „OBJS“ kintamasis priklauso nuo šaltinio failo per „SRCS“ kintamąjį.

Komentarai: Žmonėms suprantamos instrukcijos paprastai naudojamos paaiškinti kodo eilutės paskirtį, jei failą naudojate po ilgo laiko. Šiame makefile kiekvienai eilutei paaiškinti naudojame komentarus, prasidedančius „#“ ženklu.



CXX = g++
CXXFLAGS = -std =c++ vienuolika -Siena
TIKSLAS = Naujas
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
visi: $ ( TIKSLAS )
$ ( TIKSLAS ) : $ ( OBJS )
$ ( CXX ) $ ( CXX FLAGS ) -O $ ( TIKSLAS ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXX FLAGS ) -c $ < -O $ @
švarus:
rm -f $ ( TIKSLAS ) $ ( OBJS )

Bendros problemos ir sprendimai

Rašant bet kokį make-file, būtina atsižvelgti į kiekvieną smulkmeną, kad pabaigoje gautumėte norimą rezultatą. Kurdami makefailą vartotojai dažnai susiduria su kai kuriomis įprastomis problemomis. Šiame skyriuje aptarsime šias problemas ir pasiūlysime galimus sprendimus:

1: nenaudoja kintamųjų

Kintamųjų naudojimas makefile yra privalomas, nes reikia nustatyti kompiliatorius, tikslą, šaltinio failus ir t. t. Dažniausia problema, su kuria galima susidurti, yra nenaudoti jokio kintamojo makefile. Todėl būtinai naudokite esminius kintamuosius, tokius kaip CXX, CXXFLAGSc (kompiliatoriaus vėliavėlės), TARGET, SRCS ir OBJS ankstesniame makefile pavyzdyje.

2: trūksta skyriklio problemos

Rašant makefile, būtina labai atidžiai atsižvelgti į įtraukų taisykles, nes naudojant tarpus, o ne tabuliatorius, vykdant komandą „make“ atsiras „trūkstamas skyriklis“. Pavyzdžiui, taisyklės pradžioje 13 eilutėje pridedame tarpą ir pašaliname skirtuką.

$ ( TIKSLAS ) : $ ( OBJS )
$ ( CXX ) $ ( CXX FLAGS ) -O $ ( TIKSLAS ) $ ( OBJS )

Vykdydami „make“ užklausą, 13 eilutėje gauname klaidą „trūkstamas separatorius“ ir failas nustoja veikti. Kad išvengtumėte šios problemos, vietoj tarpų naudokite „tabuliuką“.

padaryti

Kad išvengtumėte šios problemos, naudokite „tabuliuką“, o ne tarpus, kaip parodyta šiame paveikslėlyje:

$ ( TIKSLAS ) : $ ( OBJS )
$ ( CXX ) $ ( CXX FLAGS ) -O $ ( TIKSLAS ) $ ( OBJS )

3: „Įėjimo taško nerasta“ problema

Ši klaida dažniausiai atsiranda dėl šaltinio failo, o ne dėl makefile, pavyzdžiui, kai šaltinio kodo faile nenaudojate funkcijos „main()“. Pavyzdžiui, funkcijos main() apibrėžimą pakeičiame paprasta vartotojo apibrėžta funkcijos deklaracija.

#include
tarpinis šou ( ) {
char v;
std::cout << 'Įveskite vertę:' ;
std::cin >> in;
std::cout << in << std::endl;
grąžinti 0 ;
}

Vykdydami „make“ instrukciją „Windows“ komandų eilutėje, susiduriame su „neapibrėžta nuoroda į „WinMain“. Taip yra todėl, kad kompiliatorius neranda jokio įėjimo taško, kad galėtų pradėti vykdyti C++ failą. Norėdami tai išspręsti, pakeiskite „show“ į „main“.

4: Neteisingų plėtinių naudojimas

Kartais vartotojas gali netyčia naudoti netinkamus šaltinio failo plėtinius, kurie bus naudojami makefile. Naudojant netinkamą plėtinį gali atsirasti vykdymo klaidų, t. y. nebus taisyklės, kaip nustatyti tikslą. Mes sukuriame makefile, kad sukurtume C++ failo vykdomąjį ir objekto failą. Septintoje eilutėje pateikiame šaltinio failą su plėtiniu 'c'.

CXX := g++
CXXFLAGS := -std =c++ vienuolika -Siena
TIKSLAS = naujas
SRCS = pagrindinis.c
OBJS = $ ( SRCS:.cpp=.o )
Visi: $ ( TIKSLAS )
$ ( TIKSLAS ) : $ ( OBJS )

Vykdydami instrukciją „make“ pamatysime klaidą „No rule to make target „main.c““. Norėdami išvengti šios problemos, įsitikinkite, kad naudojate tinkamą šaltinio failo plėtinį.

padaryti

5: trūksta priklausomybių

Rašydami makefile turėtumėte įtraukti visas šaltinio failo priklausomybes, kad gautumėte norimą išvestį. Pavyzdžiui, mūsų C++ kodo failas kaip priklausomybę naudoja failą „myheader.h“. Todėl mes jį minime C++ kodo faile taip:

#include
#include „mano antraštė.h“
tarpinis šou ( ) {
char v;
std::cout << 'Įveskite vertę:' ;
std::cin >> in;
std::cout << in << std::endl;
grąžinti 0 ;
}

Makefile mes sąmoningai nepaisome „myheader.h“ failo naudojimo kūrimo taisyklėje, kuri parašyta 9 eilutėje.

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

Dabar, naudodamiesi „padaryti“ instrukcija, susiduriame su klaida „Nieko nereikia daryti visiems“.

padaryti

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

Norėdami išvengti minėtos problemos ir sėkmingai paleisti šaltinio kodą, paminėkite „myheader.h“ failo pavadinimą devintoje makefile eilutėje, kaip parodyta toliau:

Išvada

Šiame vadove mes nuodugniai paaiškinome makefile sintaksę, naudodami reikalingą turinį, pvz., kintamuosius, kūrimo komandas, taisykles ir kt. Kodo pavyzdys įtrauktas, kad sintaksė būtų aiškiau išdėstyta. Pabaigoje aptarėme kai kurias įprastas problemas ir jų sprendimus, su kuriais vartotojas gali susidurti kurdamas makefile.