Pochopení syntaxe Makefile: Běžné problémy a řešení (včetně „Chybí operátor“ a „Vstupní bod nenalezen“)

Pochopeni Syntaxe Makefile Bezne Problemy A Reseni Vcetne Chybi Operator A Vstupni Bod Nenalezen



Stejně jako soubor kódu obsahuje jeden nebo více řádků kódu jako obsah, aby se to vyplatilo, je základní soubor makefile vytvořen pomocí proměnných, pravidel a cílů. Kromě toho existují další faktory, které jsou nezbytné k vytvoření kompletního makefile bez jakýchkoli problémů. V této příručce probereme základní syntaxi makefile a běžné problémy při psaní makefile a poskytneme řešení, jak tyto problémy vyřešit.

Pochopení základní syntaxe Makefile

Abychom mohli začít s vytvářením souboru makefile, vysvětlíme základní vlastnosti souboru makefile na příkladu kódu makefile. Chcete-li získat spustitelný soubor, je nutné do obsahu makefile zahrnout následující vlastnosti syntaxe:







Variabilní s: Základní data ukládající objekty, které je nutné použít v makefile. Tyto proměnné se používají k určení kompilátoru, příznaků, zdrojových souborů, objektových souborů a cílových souborů. V následujícím ukázkovém makefile je celkem pět proměnných, kterými jsou CXX (pro nastavení kompilátoru C++), CXXFLAGSc (příznaky kompilátoru), TARGET (pro nastavení názvu cílového spustitelného souboru), SRCS (pro nastavení souboru zdrojového kódu) , OBJS (aby obsahoval soubory objektů, které jsou generovány prostřednictvím souboru zdrojového kódu).



Cíle: Očekávaný výstup vytvořený ze zdroje. Může to být cílový soubor nebo jakýkoli symbolický název: „all“ je výchozí cíl, který by měl být vytvořen pomocí proměnné „TARGET“, „$TARGET“ závisí na proměnných „OBJS“ a „clean“ target odstraní cíl a objektové soubory z pracovního adresáře.



Pravidla a příkazy sestavení: Sada základních instrukcí, které mají být provedeny pro vytvoření cíle ze zdrojového souboru nebo závislostí. Pravidlo „%.o: %.cpp“ například zobrazuje, že soubor s příponou „cpp“ se používá k vytvoření objektového souboru s příponou „o“, přičemž oba soubory obsahují stejný název. Na druhou stranu příkaz build $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) se používá k propojení souboru objektu a nového cílového souboru. Stejným způsobem příkaz build $(CXX) $(CXXFLAGS) -c $< -o $@ zkompiluje zdrojový soubor do objektového souboru.





Závislosti: Když chcete vytvořit makefile, vždy existují závislosti. Například cíl „vše“ závisí na proměnné „TARGET“, zatímco „TARGET“ závisí na proměnné „OBJS“. Zároveň je proměnná „OBJS“ závislá na zdrojovém souboru prostřednictvím proměnné „SRCS“.

komentáře: Člověku srozumitelné pokyny se obvykle používají k vysvětlení účelu řádky kódu v případě, že používáte soubor po dlouhé době. V následujícím makefile používáme komentáře začínající znakem „#“ k vysvětlení každého řádku.



CXX = g++
CXXFLAGS = -std =c++ jedenáct -Stěna
CÍL = Nový
SRCS = main.cpp
OBJS = $ ( SRCS:.cpp=.o )
vše: $ ( CÍLOVÁ )
$ ( CÍLOVÁ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) $ ( CÍLOVÁ ) $ ( OBJS )
% .Ó: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -C $ < $ @
čistý:
rm -F $ ( CÍLOVÁ ) $ ( OBJS )

Běžné problémy a řešení

Při psaní jakéhokoli makefile je nutné zvážit každý drobný detail, abyste na konci dostali požadovaný výstup. Při vytváření souboru makefile se uživatelé často setkávají s některými běžnými problémy. V této části probereme tyto problémy a navrhneme možná řešení následovně:

1: Bez použití proměnných

Použití proměnných v makefile je nutností, protože je nutné nastavit kompilátory, cíl, zdrojové soubory atd. Nejběžnějším problémem, se kterým se lze setkat, je nepoužívání žádné proměnné v makefile. Proto se ujistěte, že používáte základní proměnné jako CXX, CXXFLAGSc (příznaky kompilátoru), TARGET, SRCS a OBJS v předchozím ukázkovém makefile.

2: Chybějící problém se separátorem

Při psaní makefile je nutné velmi pozorně zvážit pravidla pro odsazení, protože použití mezer místo tabulátorů povede k problému s „chybějícím oddělovačem“ při provádění instrukce „make“. Například přidáme mezeru na začátek pravidla na řádku 13 a odebereme tabulátor.

$ ( CÍLOVÁ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) $ ( CÍLOVÁ ) $ ( OBJS )

Po provedení dotazu „make“ se na řádku 13 zobrazí chyba „chybějící oddělovač“ a soubor se zastaví. Chcete-li se tomuto problému vyhnout, použijte místo mezer „tabulátor“.

udělat

Chcete-li se tomuto problému vyhnout, použijte místo mezer „tabulátor“, jak je znázorněno na následujícím obrázku:

$ ( CÍLOVÁ ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) $ ( CÍLOVÁ ) $ ( OBJS )

3: Problém „Vstupní bod nenalezen“.

Tato chyba se většinou vyskytuje kvůli zdrojovému souboru a ne kvůli makefile, jako když vynecháte použití funkce „main()“ v souboru zdrojového kódu. Například nahradíme definici funkce main() jednoduchou deklarací funkce definované uživatelem.

#include
int show ( ) {
char v;
std::cout << 'Zadejte hodnotu:' ;
std::cin >> v;
std::cout << v << std::endl;
vrátit se 0 ;
}

Po provedení instrukce „vytvořit“ na příkazovém řádku systému Windows narazíme na „nedefinovaný odkaz na „WinMain“. Je to proto, že kompilátor nenalezne žádný vstupní bod pro spuštění souboru C++. Chcete-li tento problém vyřešit, nahraďte „zobrazit“ za „hlavní“.

4: Použití nesprávných rozšíření

Někdy může uživatel neúmyslně použít nesprávné přípony pro zdrojový soubor, který má být použit v makefile. Použití nesprávného rozšíření povede k chybám za běhu, tj. žádné pravidlo pro vytvoření cíle. Vytvoříme makefile pro vytvoření spustitelného a objektového souboru pro soubor C++. Na sedmém řádku poskytujeme zdrojový soubor s příponou „c“.

CXX := g++
CXXFLAGS := -std =c++ jedenáct -Stěna
CÍL = nový
SRCS = hlavní.c
OBJS = $ ( SRCS:.cpp=.o )
Vše: $ ( CÍLOVÁ )
$ ( CÍLOVÁ ) : $ ( OBJS )

Spuštěním instrukce „make“ se dostaneme k chybě „No rule to make target ‚main.c‘“. Chcete-li se tomuto problému vyhnout, ujistěte se, že používáte správnou příponu zdrojového souboru.

udělat

5: Chybějící závislosti

Při psaní makefile byste měli zahrnout všechny závislosti pro zdrojový soubor, abyste získali požadovaný výstup. Například náš soubor kódu C++ používá jako závislost soubor „myheader.h“. Proto jej zmiňujeme v souboru kódu C++ takto:

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

V rámci makefile záměrně ignorujeme použití souboru „myheader.h“ v pravidle sestavení, které je napsáno na řádku 9.

% .Ó: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -C $ < $ @

Nyní, když používáme instrukci „vytvořit“, narazíme na chybu „Pro „vše“ nelze nic udělat.

udělat

% .Ó: % .cpp myheader.h
$ ( CXX ) $ ( CXXFLAGS ) -C $ < $ @

Chcete-li se vyhnout uvedenému problému a úspěšně spustit zdrojový kód, uveďte název souboru „myheader.h“ na devátém řádku souboru makefile, jak je znázorněno níže:

Závěr

V této příručce jsme důkladně vysvětlili syntaxi makefile pomocí jeho nezbytného obsahu, jako jsou proměnné, příkazy sestavení, pravidla atd. Příklad kódu je zahrnut, aby byla syntaxe jasnější. Na závěr jsme probrali některé běžné problémy a jejich řešení, se kterými se může uživatel při vytváření makefile setkat.