Razumevanje sintakse Makefile: Pogoste težave in rešitve (vključno z »Manjkajočim operaterjem« in »Vstopne točke ni bilo mogoče najti«)

Razumevanje Sintakse Makefile Pogoste Tezave In Resitve Vkljucno Z Manjkajocim Operaterjem In Vstopne Tocke Ni Bilo Mogoce Najti



Tako kot kodna datoteka vsebuje eno ali več vrstic kode kot vsebino, zaradi katere je vredna truda, je osnovna make datoteka sestavljena z uporabo spremenljivk, pravil in ciljev. Poleg tega obstajajo tudi drugi dejavniki, ki so potrebni za izdelavo popolne makefile brez težav. V tem priročniku bomo razpravljali o osnovni sintaksi datoteke makefile in pogostih težavah med pisanjem datoteke makefile ter ponudili rešitve za rešitev teh težav.

Razumevanje osnovne sintakse Makefile

Za začetek ustvarjanja datoteke makefile razložimo osnovne lastnosti datoteke makefile s primerom kode makefile. Da bi dobili izvršljivo datoteko, je treba v vsebino makefile vključiti naslednje sintaksne lastnosti:







Spremenljivka s: objekti za shranjevanje osnovnih podatkov, ki jih je treba uporabiti v makefile. Te spremenljivke se uporabljajo za določanje prevajalnika, zastavic, izvornih datotek, objektnih datotek in ciljnih datotek. V naslednji vzorčni make-datoteki je skupaj pet spremenljivk, in sicer CXX (za nastavitev prevajalnika C++), CXXFLAGSc (zastavice prevajalnika), TARGET (za nastavitev imena ciljne izvršljive datoteke), SRCS (za nastavitev datoteke izvorne kode) , OBJS (da vsebuje objektne datoteke, ki so ustvarjene prek datoteke izvorne kode).



Cilji: Pričakovani izhod, ki bo zgrajen iz vira. Lahko je ciljna datoteka ali katero koli simbolično ime: »all« je privzeti cilj, ki ga je treba zgraditi prek spremenljivke »TARGET«, »$TARGET« je odvisen od spremenljivk »OBJS«, »clean« target pa odstrani cilj in objektne datoteke iz delovnega imenika.



Pravila in ukazi za gradnjo: Nabor osnovnih navodil, ki jih je treba izvesti za ustvarjanje cilja iz izvorne datoteke ali odvisnosti. Na primer, pravilo »%.o: %.cpp« prikazuje, da se datoteka s pripono »cpp« uporablja za ustvarjanje objektne datoteke s pripono »o«, medtem ko obe datoteki vsebujeta isto ime. Po drugi strani pa ukaz build $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) se uporablja za povezovanje objektne datoteke in nove ciljne datoteke. Na enak način ukaz build $(CXX) $(CXXFLAGS) -c $< -o $@ prevede izvorno datoteko v objektno datoteko.





Odvisnosti: Ko želite ustvariti makefile, so odvisnosti vedno prisotne. Na primer, cilj »vse« je odvisen od spremenljivke »TARGET«, medtem ko je »TARGET« odvisen od spremenljivke »OBJS«. Hkrati je spremenljivka “OBJS” odvisna od izvorne datoteke prek spremenljivke “SRCS”.

Komentarji: Človeku razumljiva navodila se običajno uporabljajo za razlago namena vrstice kode, če datoteko uporabljate po dolgem času. V naslednji datoteki makefile uporabljamo komentarje, ki se začnejo z znakom »#«, da razložimo vsako vrstico.



CXX = g++
CXXZASTAVE = -std =c++ enajst -Zid
TARGET = Novo
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
vse: $ ( CILJ )
$ ( CILJ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXZASTAVE ) -O $ ( CILJ ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXZASTAVE ) -c $ < -O $ @
čisto:
rm -f $ ( CILJ ) $ ( OBJS )

Pogoste težave in rešitve

Med pisanjem katere koli datoteke makefile je treba upoštevati vsako manjšo podrobnost, da na koncu dobimo želeni rezultat. Uporabniki med ustvarjanjem datoteke makefile pogosto naletijo na nekatere pogoste težave. V tem razdelku bomo razpravljali o teh vprašanjih in predlagali možne rešitve, kot sledi:

1: Brez uporabe spremenljivk

Uporaba spremenljivk v make-datoteki je nujna, saj je treba nastaviti prevajalnike, ciljne, izvorne datoteke itd. Najpogostejša težava, na katero lahko naletite, je, da v make-file ne uporabljate nobene spremenljivke. Zato se prepričajte, da uporabite bistvene spremenljivke, kot so CXX, CXXFLAGSc (zastavice prevajalnika), TARGET, SRCS in OBJS v prejšnji vzorčni make-datoteki.

2: Težava z manjkajočim ločilom

Pri pisanju make-datoteke je treba zelo pozorno upoštevati pravila zamika, saj vas bo uporaba presledkov namesto tabulatorjev pripeljala do težave z 'manjkajočim ločilom' med izvajanjem ukaza 'make'. Na primer, dodamo presledek na začetku pravila v vrstici 13 in odstranimo zavihek.

$ ( CILJ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXZASTAVE ) -O $ ( CILJ ) $ ( OBJS )

Po izvedbi poizvedbe »make« dobimo v vrstici 13 napako »missing separator« in datoteka se preneha izvajati. Da bi se izognili tej težavi, poskrbite, da namesto presledkov uporabite »tabulator«.

narediti

Da bi se izognili tej težavi, uporabite »tab« namesto presledkov, kot je prikazano na naslednji sliki:

$ ( CILJ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXZASTAVE ) -O $ ( CILJ ) $ ( OBJS )

3: Težava »Vstopne točke ni bilo mogoče najti«.

Ta napaka se večinoma pojavi zaradi izvorne datoteke in ne zaradi makefile-a, kot če zamudite uporabo funkcije »main()« v datoteki izvorne kode. Na primer, definicijo funkcije main() zamenjamo s preprosto deklaracijo funkcije, ki jo definira uporabnik.

#include
int oddaja ( ) {
char v;
std::cout << 'Vnesite vrednost: ' ;
std::cin >> v;
std::cout << v << std::endl;
vrnitev 0 ;
}

Po izvedbi ukaza »make« v ukazni vrstici sistema Windows naletimo na »nedefinirano referenco na 'WinMain'«. To je zato, ker prevajalnik ne najde nobene vstopne točke za začetek izvajanja datoteke C++. Če želite to rešiti, zamenjajte »show« z »main«.

4: Uporaba nepravilnih razširitev

Včasih lahko uporabnik nenamerno uporabi napačne končnice za izvorno datoteko, ki bo uporabljena v makefile. Uporaba napačne razširitve bo povzročila napake med izvajanjem, tj. brez pravila za določitev cilja. Ustvarimo makefile za izdelavo izvedljive in objektne datoteke za datoteko C++. V sedmi vrstici podajamo izvorno datoteko s pripono 'c'.

CXX := g++
CXXZASTAVE := -std =c++ enajst -Zid
TARGET = novo
SRCS = glavni.c
OBJS = $ ( SRCS:.cpp=.o )
Vse: $ ( CILJ )
$ ( CILJ ) : $ ( OBJS )

Izvajanje ukaza »make« nas pripelje do napake »No rule to make target 'main.c'«. Da bi se izognili tej težavi, se prepričajte, da uporabljate pravilno pripono izvorne datoteke.

narediti

5: Manjkajoče odvisnosti

Med pisanjem datoteke makefile morate vključiti vse odvisnosti za izvorno datoteko, da dobite želeni rezultat. Na primer, naša kodna datoteka C++ uporablja datoteko »myheader.h« kot svojo odvisnost. Zato ga omenjamo v kodni datoteki C++ na naslednji način:

#include
#include “myheader.h”
int oddaja ( ) {
char v;
std::cout << 'Vnesite vrednost: ' ;
std::cin >> v;
std::cout << v << std::endl;
vrnitev 0 ;
}

Znotraj makefile namerno ignoriramo uporabo datoteke 'myheader.h' znotraj pravila gradnje, ki je zapisano v 9. vrstici.

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

Zdaj, ko uporabljamo navodilo »make«, naletimo na napako »Nič ni treba storiti za 'vse'«.

narediti

% .O: % .cpp moja glava.h
$ ( CXX ) $ ( CXXZASTAVE ) -c $ < -O $ @

Da bi se izognili omenjeni težavi in ​​uspešno zagnali izvorno kodo, navedite ime datoteke »myheader.h« v deveti vrstici makefilea, kot je prikazano v nadaljevanju:

Zaključek

V tem priročniku smo temeljito razložili sintakso datoteke makefile z uporabo njenih potrebnih vsebin, kot so spremenljivke, ukazi za gradnjo, pravila itd. Primer kode je vključen za jasnejšo razlago sintakse. Na koncu smo razpravljali o nekaterih običajnih težavah in njihovih rešitvah, na katere lahko naleti uporabnik med ustvarjanjem makefile.