Razumijevanje sintakse Makefilea: Uobičajeni problemi i rješenja (uključujući 'Operator koji nedostaje' i 'Ulazna točka nije pronađena')

Razumijevanje Sintakse Makefilea Uobicajeni Problemi I Rjesenja Ukljucujuci Operator Koji Nedostaje I Ulazna Tocka Nije Pronadena



Baš kao što kodna datoteka sadrži jednu ili više redaka koda kao sadržaj da bi bila vrijedna truda, osnovna make datoteka je konstruirana pomoću varijabli, pravila i ciljeva. Osim toga, postoje i drugi čimbenici koji su neophodni za izradu kompletne makefile bez ikakvih problema. U ovom ćemo vodiču raspravljati o osnovnoj sintaksi makefilea i uobičajenim problemima tijekom pisanja makefilea te pružiti rješenja za rješavanje tih problema.

Razumijevanje osnovne sintakse Makefilea

Kako bismo započeli s izradom makefilea, objašnjavamo osnovna svojstva makefilea putem primjera makefile koda. Potrebno je uključiti sljedeća svojstva sintakse u sadržaj makefile da biste dobili izvršnu datoteku:







Varijabilna s: Objekti koji pohranjuju osnovne podatke koji su potrebni za korištenje u make datoteci. Ove se varijable koriste za određivanje kompilatora, zastavica, izvornih datoteka, objektnih datoteka i ciljnih datoteka. Unutar sljedeće make-datoteke uzorka, postoji ukupno pet varijabli koje su CXX (za postavljanje C++ prevoditelja), CXXFLAGSc (zastavice prevoditelja), TARGET (za postavljanje naziva ciljne izvršne datoteke), SRCS (za postavljanje datoteke izvornog koda) , OBJS (da sadrži objektne datoteke koje su generirane putem datoteke izvornog koda).



Ciljevi: Očekivani izlaz za izgradnju iz izvora. To može biti ciljna datoteka ili bilo koji simbolički naziv: 'all' je zadani cilj koji bi trebao biti izgrađen putem varijable 'TARGET', '$TARGET' ovisi o varijabli 'OBJS', a 'clean' cilj uklanja cilj i objektne datoteke iz radnog direktorija.



Pravila i naredbe za izgradnju: Skup osnovnih uputa koje treba izvršiti za stvaranje cilja iz izvorne datoteke ili ovisnosti. Na primjer, pravilo '%.o: %.cpp' prikazuje da se datoteka s ekstenzijom 'cpp' koristi za stvaranje objektne datoteke s ekstenzijom 'o' dok obje datoteke sadrže isti naziv. S druge strane, naredba build $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) koristi se za povezivanje objektne datoteke i nove ciljne datoteke. Na isti način, naredba build $(CXX) $(CXXFLAGS) -c $< -o $@ kompilira izvornu datoteku u objektnu datoteku.





Ovisnosti: Zavisnosti su uvijek tu kada želite stvoriti makefile. Na primjer, cilj 'all' ovisi o varijabli 'TARGET', dok 'TARGET' ovisi o varijabli 'OBJS'. U isto vrijeme, varijabla “OBJS” ovisi o izvornoj datoteci preko varijable “SRCS”.

Komentari: Ljudima razumljive upute obično se koriste za objašnjenje svrhe retka koda u slučaju da koristite datoteku nakon dugo vremena. U sljedećoj make datoteci koristimo komentare koji počinju znakom '#' za objašnjenje svakog retka.



CXX = g++
CXXZASTAVE = -std =c++ jedanaest -Zid
TARGET = Novo
SRCS = glavni.cpp
OBJS = $ ( SRCS:.cpp=.o )
sve: $ ( CILJ )
$ ( CILJ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXZASTAVE ) -O $ ( CILJ ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXZASTAVE ) -c $ < -O $ @
čist:
rm -f $ ( CILJ ) $ ( OBJS )

Uobičajeni problemi i rješenja

Prilikom pisanja bilo kojeg makefilea potrebno je uzeti u obzir svaki manji detalj kako bi na kraju dobili željeni izlaz. Korisnici često nailaze na neke uobičajene probleme dok stvaraju makefile. Unutar ovog odjeljka raspravljat ćemo o tim problemima i predložiti moguća rješenja kako slijedi:

1: Bez korištenja varijabli

Korištenje varijabli u make datoteci je obavezno jer je potrebno postaviti prevoditelje, ciljne, izvorne datoteke, itd. Najčešći problem s kojim se možete susresti je nekorištenje nijedne varijable u make datoteci. Stoga svakako koristite bitne varijable kao što su CXX, CXXFLAGSc (zastavice prevoditelja), TARGET, SRCS i OBJS u prethodnoj make datoteci uzorka.

2: Problem s nedostatkom razdjelnika

Prilikom pisanja makefilea potrebno je vrlo pažljivo razmotriti pravila uvlačenja jer će vas korištenje razmaka umjesto tabulatora dovesti do problema s 'nedostajućim separatorom' tijekom izvođenja instrukcije 'make'. Na primjer, dodajemo razmak na početku pravila u retku 13 i uklanjamo tabulator.

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

Nakon izvršenja upita 'make', dobivamo pogrešku 'missing separator' u retku 13 i datoteka se prestaje izvoditi. Da biste izbjegli ovaj problem, svakako koristite 'tabulator' umjesto razmaka.

napraviti

Da biste izbjegli ovaj problem, svakako koristite 'tabulator' umjesto razmaka kao što je prikazano na sljedećoj slici:

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

3: Problem 'Ulazna točka nije pronađena'.

Ova se pogreška uglavnom javlja zbog izvorne datoteke, a ne zbog makefilea kao kada propustite korištenje funkcije 'main()' u datoteci izvornog koda. Na primjer, definiciju funkcije main() zamjenjujemo jednostavnom korisnički definiranom deklaracijom funkcije.

#include
int emisija ( ) {
char v;
std::cout << 'Unesite vrijednost: ' ;
std::cin >> u;
std::cout << u << std::endl;
povratak 0 ;
}

Nakon izvršavanja instrukcije 'make' na naredbenom retku Windowsa, nailazimo na 'nedefiniranu referencu na 'WinMain''. To je zato što prevodilac ne nalazi nikakvu ulaznu točku za početak izvršavanja C++ datoteke. Da biste to riješili, zamijenite 'show' s 'main'.

4: Korištenje netočnih ekstenzija

Ponekad korisnik može nenamjerno koristiti pogrešne ekstenzije za izvornu datoteku koja će se koristiti u make datoteci. Korištenje pogrešnog proširenja dovest će do pogrešaka tijekom izvođenja, tj. nema pravila za postavljanje cilja. Stvaramo makefile za izgradnju izvršne i objektne datoteke za C++ datoteku. U sedmom retku dajemo izvornu datoteku s ekstenzijom 'c'.

CXX := g++
CXXZASTAVE := -std =c++ jedanaest -Zid
CILJA = novo
SRCS = glavni.c
OBJS = $ ( SRCS:.cpp=.o )
Sve: $ ( CILJ )
$ ( CILJ ) : $ ( OBJS )

Pokretanje instrukcije 'make' dovodi nas do pogreške 'Nema pravila za izradu cilja 'main.c''. Da biste izbjegli ovaj problem, svakako koristite ispravan nastavak izvorne datoteke.

napraviti

5: Ovisnosti koje nedostaju

Dok pišete makefile, trebali biste uključiti sve ovisnosti za izvornu datoteku kako biste dobili željeni izlaz. Na primjer, naša C++ kodna datoteka koristi datoteku 'myheader.h' kao svoju ovisnost. Stoga ga spominjemo u C++ kodnoj datoteci na sljedeći način:

#include
#include “myheader.h”
int emisija ( ) {
char v;
std::cout << 'Unesite vrijednost: ' ;
std::cin >> u;
std::cout << u << std::endl;
povratak 0 ;
}

Unutar makefilea, namjerno zanemarujemo korištenje datoteke 'myheader.h' unutar pravila izgradnje koje je napisano u retku 9.

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

Sada, dok koristimo naredbu 'make', nailazimo na pogrešku 'Ništa ne treba učiniti za 'sve''.

napraviti

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

Kako biste izbjegli navedeni problem i uspješno pokrenuli izvorni kod, spomenite naziv datoteke 'myheader.h' u devetom retku makefile-a kao što je prikazano u nastavku:

Zaključak

Unutar ovog vodiča temeljito smo objasnili sintaksu makefilea koristeći njegove potrebne sadržaje kao što su varijable, naredbe za izgradnju, pravila itd. Primjer koda je uključen kako bi se sintaksa jasnije razradila. Na kraju smo razgovarali o nekim uobičajenim problemima i njihovim rješenjima s kojima se korisnik može susresti tijekom izrade makefilea.