Pochopenie syntaxe Makefile: Bežné problémy a riešenia (vrátane „Chýbajúci operátor“ a „Vstupný bod sa nenašiel“)

Pochopenie Syntaxe Makefile Bezne Problemy A Riesenia Vratane Chybajuci Operator A Vstupny Bod Sa Nenasiel



Rovnako ako súbor kódu obsahuje jeden alebo viac riadkov kódu ako obsah, aby sa to vyplatilo, základný súbor makefile je vytvorený pomocou premenných, pravidiel a cieľov. Okrem toho existujú aj ďalšie faktory, ktoré sú potrebné na vytvorenie úplného súboru makefile bez akýchkoľvek problémov. V tejto príručke budeme diskutovať o základnej syntaxi makefile a bežných problémoch pri písaní makefile a poskytneme riešenia na vyriešenie týchto problémov.

Pochopenie základnej syntaxe Makefile

Aby sme mohli začať s vytváraním súboru makefile, vysvetlíme základné vlastnosti súboru makefile na príklade kódu makefile. Na získanie spustiteľného súboru je potrebné zahrnúť nasledujúce vlastnosti syntaxe do obsahu makefile:







Variabilné s: Základné údaje ukladajúce objekty, ktoré je potrebné použiť v makefile. Tieto premenné sa používajú na špecifikáciu kompilátora, príznakov, zdrojových súborov, objektových súborov a cieľových súborov. V nasledujúcom vzorovom makefile je celkovo päť premenných, ktorými sú CXX (na nastavenie kompilátora C++), CXXFLAGSc (príznaky kompilátora), TARGET (na nastavenie názvu cieľového spustiteľného súboru), SRCS (na nastavenie súboru zdrojového kódu) , OBJS (aby obsahoval objektové súbory, ktoré sú generované prostredníctvom súboru zdrojového kódu).



Ciele: Očakávaný výstup zo zdroja. Môže to byť cieľový súbor alebo akýkoľvek symbolický názov: „all“ je predvolený cieľ, ktorý by mal byť vytvorený pomocou premennej „TARGET“, „$TARGET“ závisí od premenných „OBJS“ a „clean“ target odstraňuje cieľ a objektové súbory z pracovného adresára.



Pravidlá a príkazy na zostavenie: Sada základných inštrukcií, ktoré sa majú vykonať na vytvorenie cieľa zo zdrojového súboru alebo závislostí. Napríklad pravidlo „%.o: %.cpp“ zobrazuje, že súbor s príponou „cpp“ sa používa na vytvorenie objektového súboru s príponou „o“, pričom oba súbory obsahujú rovnaký názov. Na druhej strane príkaz build $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) sa používa na prepojenie objektového súboru a nového cieľového súboru. Rovnakým spôsobom príkaz build $(CXX) $(CXXFLAGS) -c $< -o $@ skompiluje zdrojový súbor do objektového súboru.





Závislosti: Závislosti sú tu vždy, keď chcete vytvoriť súbor makefile. Napríklad cieľ „všetky“ závisí od premennej „TARGET“, zatiaľ čo „TARGET“ závisí od premennej „OBJS“. Zároveň je premenná „OBJS“ závislá od zdrojového súboru prostredníctvom premennej „SRCS“.

Komentáre: Ľudsky zrozumiteľné pokyny sa zvyčajne používajú na vysvetlenie účelu riadku kódu v prípade, že súbor používate po dlhšom čase. V nasledujúcom makefile používame komentáre začínajúce znakom „#“ na vysvetlenie každého riadku.



CXX = g++
CXXFLAGS = -štd =c++ jedenásť -Stena
CIEĽ = Nový
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
všetko: $ ( CIEĽ )
$ ( CIEĽ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( CIEĽ ) $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -O $ @
čisté:
rm -f $ ( CIEĽ ) $ ( OBJS )

Bežné problémy a riešenia

Pri písaní akéhokoľvek makefile je potrebné zvážiť každý malý detail, aby ste na konci dostali požadovaný výstup. Pri vytváraní súboru makefile sa používatelia často stretávajú s niektorými bežnými problémami. V tejto časti budeme diskutovať o týchto problémoch a navrhneme možné riešenia nasledovne:

1: Bez použitia premenných

Používanie premenných v súbore makefile je nevyhnutnosťou, pretože je potrebné nastaviť kompilátory, cieľ, zdrojové súbory atď. Najčastejším problémom, s ktorým sa možno stretnúť, je nepoužívanie žiadnej premennej v súbore makefile. Preto sa uistite, že používate základné premenné ako CXX, CXXFLAGSc (príznaky kompilátora), TARGET, SRCS a OBJS v predchádzajúcom vzorovom makefile.

2: Problém s chýbajúcim oddeľovačom

Pri písaní súboru makefile je potrebné veľmi pozorne zvážiť pravidlá odsadzovania, pretože použitie medzier namiesto tabulátorov vás pri vykonávaní príkazu „make“ privedie k problému s „chýbajúcim oddeľovačom“. Napríklad pridáme medzeru na začiatok pravidla v riadku 13 a odstránime tabulátor.

$ ( CIEĽ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( CIEĽ ) $ ( OBJS )

Po vykonaní dotazu „make“ sa na riadku 13 zobrazí chyba „chýbajúci oddeľovač“ a súbor sa zastaví. Ak sa chcete tomuto problému vyhnúť, použite namiesto medzier „tabulátor“.

urobiť

Ak sa chcete tomuto problému vyhnúť, použite namiesto medzier „tabulátor“, ako je znázornené na nasledujúcom obrázku:

$ ( CIEĽ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -O $ ( CIEĽ ) $ ( OBJS )

3: Problém „Vstupný bod sa nenašiel“.

Táto chyba sa väčšinou vyskytuje kvôli zdrojovému súboru a nie kvôli makefile, ako keď vynecháte použitie funkcie „main()“ v súbore zdrojového kódu. Napríklad definíciu funkcie main() nahradíme jednoduchou deklaráciou funkcie definovanou používateľom.

#include
int show ( ) {
char v;
std::cout << 'Zadajte hodnotu: ' ;
std::cin >> v;
std::cout << v << std::endl;
vrátiť 0 ;
}

Po vykonaní inštrukcie „make“ na príkazovom riadku systému Windows sa stretneme s „nedefinovaným odkazom na „WinMain“. Je to preto, že kompilátor nenájde žiadny vstupný bod na spustenie súboru C++. Ak to chcete vyriešiť, nahraďte slovo „zobraziť“ slovom „hlavné“.

4: Použitie nesprávnych rozšírení

Niekedy môže používateľ neúmyselne použiť nesprávne prípony zdrojového súboru, ktorý sa má použiť v súbore makefile. Použitie nesprávneho rozšírenia povedie k chybám pri spustení, t. j. žiadne pravidlo na vytvorenie cieľa. Vytvoríme makefile na vytvorenie spustiteľného a objektového súboru pre súbor C++. V siedmom riadku uvádzame zdrojový súbor s príponou „c“.

CXX := g++
CXXFLAGS := -štd =c++ jedenásť -Stena
CIEĽ = nový
SRCS = hlavný.c
OBJS = $ ( SRCS:.cpp=.o )
Všetky: $ ( CIEĽ )
$ ( CIEĽ ) : $ ( OBJS )

Spustenie inštrukcie „make“ nás vedie k chybe „No rule to make target ‘main.c‘“. Ak sa chcete tomuto problému vyhnúť, uistite sa, že používate správnu príponu zdrojového súboru.

urobiť

5: Chýbajúce závislosti

Pri písaní makefile by ste mali zahrnúť všetky závislosti pre zdrojový súbor, aby ste získali požadovaný výstup. Napríklad náš súbor kódu C++ používa ako svoju závislosť súbor „myheader.h“. Preto ho uvádzame v kódovom súbore C++ takto:

#include
#include „myheader.h“
int show ( ) {
char v;
std::cout << 'Zadajte hodnotu: ' ;
std::cin >> v;
std::cout << v << std::endl;
vrátiť 0 ;
}

V rámci makefile zámerne ignorujeme použitie súboru „myheader.h“ v pravidle zostavenia, ktoré je napísané na riadku 9.

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

Teraz, keď používate inštrukciu „vyrobiť“, narazíme na chybu „Nič sa nedá urobiť pre „všetko“.

urobiť

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

Aby ste sa vyhli uvedenému problému a úspešne spustili zdrojový kód, uveďte názov súboru „myheader.h“ na deviatom riadku súboru makefile, ako je znázornené nižšie:

Záver

V tejto príručke sme dôkladne vysvetlili syntax súboru makefile pomocou jeho potrebného obsahu, ako sú premenné, príkazy na zostavenie, pravidlá atď. Príklad kódu je zahrnutý, aby bola syntax prepracovaná jasnejšie. Na záver sme diskutovali o niektorých bežných problémoch a ich riešeniach, s ktorými sa môže používateľ stretnúť pri vytváraní súboru makefile.