Makefile-syntaksin ymmärtäminen: yleiset ongelmat ja ratkaisut (mukaan lukien 'Puuttuva operaattori' ja 'Sisääntulokohtaa ei löydy')

Makefile Syntaksin Ymmartaminen Yleiset Ongelmat Ja Ratkaisut Mukaan Lukien Puuttuva Operaattori Ja Sisaantulokohtaa Ei Loydy



Aivan kuten kooditiedosto sisältää yhden tai useamman rivin koodia, jotta se olisi kannattavaa, perus makefile muodostetaan muuttujien, sääntöjen ja kohteiden avulla. Sen lisäksi on myös muita tekijöitä, jotka ovat välttämättömiä täydellisen maketiedoston tekemiseen ilman ongelmia. Tässä oppaassa keskustelemme makefile-syntaksista ja yleisistä ongelmista make-tiedoston kirjoittamisen aikana ja tarjoamme ratkaisuja näiden ongelmien ratkaisemiseen.

Makefile-perussyntaksin ymmärtäminen

Makefile-tiedoston luomisen aloittamiseksi selitämme makefile-tiedoston perusominaisuudet makefile-koodiesimerkin avulla. Makefile-sisältöön on sisällytettävä seuraavat syntaksiominaisuudet suoritettavan tiedoston saamiseksi:







Muuttuva s: Perustieto, joka tallentaa make-tiedostossa käytettäviksi tarvittavia objekteja. Näitä muuttujia käytetään määrittämään kääntäjä, liput, lähdetiedostot, objektitiedostot ja kohdetiedostot. Seuraavassa mallimaketiedostossa on yhteensä viisi muuttujaa, jotka ovat CXX (C++-kääntäjän asettaminen), CXXFLAGSc (kääntäjän liput), TARGET (kohteen suoritettavan tiedoston nimen asettaminen), SRCS (lähdekooditiedoston asettaminen). , OBJS (sisältää lähdekooditiedoston kautta luodut objektitiedostot).



Kohteet: Odotettu tulos, joka rakennetaan lähteestä. Se voi olla kohdetiedosto tai mikä tahansa symbolinen nimi: 'all' on oletuskohde, joka tulee rakentaa 'TARGET'-muuttujan kautta, '$TARGET' riippuu 'OBJS'-muuttujista ja 'clean' target poistaa kohteen ja objektitiedostot työhakemistosta.



Säännöt ja rakennuskomennot: Joukko peruskäskyjä, jotka suoritetaan kohteen luomiseksi lähdetiedostosta tai riippuvuuksista. Esimerkiksi sääntö '%.o: %.cpp' näyttää, että tiedostoa, jonka tunniste on 'cpp', käytetään objektitiedoston luomiseen, jonka tunniste on 'o', kun taas molemmilla tiedostoilla on sama nimi. Toisaalta build-komento $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) käytetään linkittämään objektitiedosto ja uusi kohdetiedosto yhteen. Samalla tavalla build-komento $(CXX) $(CXXFLAGS) -c $< -o $@ kokoaa lähdetiedoston objektitiedostoksi.





Riippuvuudet: Riippuvuudet ovat aina olemassa, kun haluat luoda maketiedoston. Esimerkiksi 'kaikki' kohde riippuu 'TARGET'-muuttujasta, kun taas 'TARGET' riippuu 'OBJS'-muuttujasta. Samanaikaisesti 'OBJS'-muuttuja on riippuvainen lähdetiedostosta 'SRCS'-muuttujan kautta.

Kommentit: Ihmisen ymmärrettävillä ohjeilla selitetään yleensä koodirivin tarkoitus siinä tapauksessa, että käytät tiedostoa pitkän ajan kuluttua. Seuraavassa make-tiedostossa käytämme '#'-merkillä alkavia kommentteja jokaisen rivin selittämiseen.



CXX = g++
CXXFLAGS = -std =c++ yksitoista - Seinä
TARGET = Uusi
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
kaikki: $ ( KOHDE )
$ ( KOHDE ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( KOHDE ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
puhdas:
rm -f $ ( KOHDE ) $ ( OBJS )

Yleisiä ongelmia ja ratkaisuja

Kun kirjoitat mitä tahansa make-tiedostoa, on tarpeen ottaa huomioon jokainen pieni yksityiskohta saadaksesi halutun tulosteen lopussa. Käyttäjät kohtaavat usein joitakin yleisiä ongelmia luodessaan make-tiedostoa. Tässä osiossa keskustelemme näistä ongelmista ja ehdotamme mahdollisia ratkaisuja seuraavasti:

1: Ei käytä muuttujia

Muuttujien käyttäminen make-tiedostossa on pakollista, koska se vaaditaan kääntäjien, kohteen, lähdetiedostojen jne. asettamiseen. Yleisin ongelma, joka voidaan kohdata, on se, ettei mitään muuttujaa käytetä make-tiedostossa. Varmista siksi, että käytät edellisessä mallitiedostossa tärkeitä muuttujia, kuten CXX, CXXFLAGSc (kääntäjän liput), TARGET, SRCS ja OBJS.

2: Erotin puuttuu

Makefileä kirjoitettaessa on syytä huomioida sisennyssäännöt erittäin tarkasti, koska välilyöntien käyttö sarkainten sijasta johtaa 'puuttuvan erottimen' ongelmaan 'make'-käskyn suorittamisen aikana. Esimerkiksi lisäämme välilyönnin säännön alkuun riville 13 ja poistamme välilehden.

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

'Make'-kyselyn suorittamisen yhteydessä saamme 'puuttuva erotin' -virheen rivillä 13, ja tiedosto lakkaa toimimasta. Välttääksesi tämän ongelman, muista käyttää välilyöntien sijaan 'sarkainta'.

tehdä

Välttääksesi tämän ongelman, muista käyttää 'sarkainta' välilyöntien sijaan, kuten seuraavassa kuvassa on kuvattu:

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

3: 'Sisääntulokohtaa ei löydy' -ongelma

Tämä virhe johtuu enimmäkseen lähdetiedostosta eikä makefile-tiedostosta, kuten kun unohdat käyttää main()-funktiota lähdekooditiedostossa. Esimerkiksi main()-funktion määritelmä korvataan yksinkertaisella käyttäjän määrittelemällä funktion määrittelyllä.

#include
int show ( ) {
char v;
std::cout << 'Anna arvo:' ;
std::cin >> sisään;
std::cout << sisään << std::endl;
palata 0 ;
}

Suorittaessamme 'make' -käskyä Windowsin komentokehotteessa kohtaamme 'määrittämättömän viittauksen 'WinMainiin'. Tämä johtuu siitä, että kääntäjä ei löydä aloituspistettä C++-tiedoston suorittamisen aloittamiseksi. Voit ratkaista tämän korvaamalla 'show' sanalla 'main'.

4: Väärien laajennusten käyttö

Joskus käyttäjä saattaa tahattomasti käyttää vääriä tiedostopäätteitä make-tiedostossa käytettävälle lähdetiedostolle. Väärän laajennuksen käyttö johtaa ajonaikaisiin virheisiin, eli ei sääntöä kohteen tekemiseksi. Luomme make-tiedoston C++-tiedoston suoritettavan ja objektitiedoston rakentamiseksi. Seitsemännellä rivillä tarjoamme lähdetiedoston 'c'-tunnisteella.

CXX := g++
CXXFLAGS := -std =c++ yksitoista - Seinä
TAVOITE = uusi
SRCS = main.c
OBJS = $ ( SRCS:.cpp=.o )
Kaikki: $ ( KOHDE )
$ ( KOHDE ) : $ ( OBJS )

'Make'-käskyn suorittaminen johtaa virheeseen 'Ei sääntöä kohteen main.c tekemiseksi'. Vältä tämä ongelma varmistamalla, että käytät oikeaa lähdetiedostotunnistetta.

tehdä

5: Puuttuvat riippuvuudet

Kun kirjoitat make-tiedostoa, sinun tulee sisällyttää kaikki lähdetiedoston riippuvuudet saadaksesi halutun tulosteen. Esimerkiksi C++-kooditiedostomme käyttää 'myheader.h'-tiedostoa riippuvuutensa. Siksi mainitsemme sen C++-kooditiedostossa seuraavasti:

#include
#include 'myheader.h'
int show ( ) {
char v;
std::cout << 'Anna arvo:' ;
std::cin >> sisään;
std::cout << sisään << std::endl;
palata 0 ;
}

Makefilessä jätämme tarkoituksella huomiotta 'myheader.h'-tiedoston käytön rivillä 9 kirjoitetussa koontisäännössä.

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

Nyt, kun käytämme 'make'-ohjetta, kohtaamme 'Kaikille ei tehdä mitään' -virheen.

tehdä

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

Välttääksesi mainitun ongelman ja suorittaaksesi lähdekoodin onnistuneesti, mainitse 'myheader.h'-tiedostonimi makefile-tiedoston yhdeksännellä rivillä, kuten seuraavassa kuvataan:

Johtopäätös

Tässä oppaassa selitimme perusteellisesti makefile-tiedoston syntaksin käyttämällä sen tarpeellista sisältöä, kuten muuttujia, koontikomentoja, sääntöjä jne. Koodiesimerkki on mukana syntaksin selkeyttämiseksi. Lopuksi keskustelimme tavallisista ongelmista ja niiden ratkaisuista, joita käyttäjä voi kohdata luodessaan make-tiedostoa.