logo

Příkaz make pro Linux

Linux udělat příkaz se používá k vytváření a údržbě skupin programů a souborů ze zdrojového kódu. V Linuxu je to jeden z nejčastěji používaných příkazů vývojářů. Pomáhá vývojářům instalovat a kompilovat mnoho utilit z terminálu. Dále se zabývá procesem kompilace rozsáhlých projektů. Šetří to čas kompilace.

Hlavním motivem příkazu make je rozdělit velký program na části a zkontrolovat, zda je třeba jej překompilovat nebo ne. Také vydává potřebné příkazy k jejich opětovné kompilaci.

V této části budeme používat programy C++, protože programovací jazyk C++ je objektově orientovaný jazyk, ale můžete použít jakýkoli jazyk nainstalovaný na vašem počítači. Neomezuje se pouze na programy; můžeme jej použít i k popisu jiných úkolů.

Jak příkaz make funguje?

Příkaz make bere cíle jako argumenty. Tyto argumenty jsou specifikovány v 'Makefile.' Makefile obsahuje cíle a také související akce související s těmito cíli.

Když spustíme příkaz make, vyhledá makefile a prohledá jej, aby našel cíl a získal přístup k jeho závislostem. Pokud nejsou uvedeny závislosti, vyhledá závislost a vytvoří ji. Po vytvoření závislostí vytvoří hlavní cíl.

Chceme-li například změnit pouze jeden zdrojový soubor a provedeme příkaz make; takže to zkompiluje pouze objektový soubor, který je spojen s tímto zdrojovým souborem. Ušetří to spoustu času při konečném sestavování projektu.

Co je Makefile?

Příkaz make vyvolá provedení souboru makefile. Je to speciální soubor, který obsahuje příkazy shellu, které vytváříme pro údržbu projektu. Makefile obsahuje cíle a příkazy pro provedení. Není povoleno vytvořit více než jeden makefile. Doporučuje se pro něj vytvořit samostatný adresář.

Sleduje poslední soubory, takže aktualizujte pouze ty soubory, které jsou vyžadovány. Pokud máme velký program s mnoha zdrojovými soubory, musíme znovu zkompilovat všechny závislé soubory. Takže to může být extrémně časově náročný proces.

Makefile obsahuje seznam standardů. Tyto standardy jsou užitečné pro systém, aby pochopil, jaký příkaz chceme provést. Tyto normy jsou rozděleny do dvou částí a jsou odděleny novým řádkem. První řádek je linii závislosti, a následující řádky jsou považovány za akce nebo příkaz s. Příkazy jsou odděleny tabulátorem na novém řádku.

The závislosti určete vztah každého souboru se zdrojovými soubory. A cílová je spustitelný soubor a je vytvořen po provedení příkazu make.

Možnosti

Příkaz make umožňuje různé možnosti, jak jej upřesnit. Některé důležité možnosti jsou následující:

    -b, -m:Tyto volby se používají k ignorování kompatibility pro různé verze příkazu make.-B, --vždy-dělat:Tyto možnosti se používají k bezpodmínečnému vytvoření všech cílů.-C dir, --directory=dir:Tyto volby se používají ke změně adresáře před spuštěním makefile.-d:Používá se k tisku informací o ladění.--debug[=VLAJKY]:Používá se k tisku informací o ladění spolu s normálním zpracováním. Pokud příznak přeskočíme, zobrazí podobné výsledky jako možnost '-d'.-e, --environment-overrides:Používá se k poskytnutí proměnných převzatých z priority prostředí do souboru makefile.-f soubor, --soubor=soubor, --makefile=SOUBOR:Používá se k použití souboru jako makefile.-i, --ignore-errors:Volba '-i' se používá k ignorování všech chyb v příkazech.-I dir, --include-dir=dir:Používá se k určení adresáře pro hledání zadaného makefile. Pokud zadáme mnoho možností '-I', bude hledat v mnoha adresářích v pořadí, které je zadáno.-j [zaměstnání], --úkoly[=úkoly]:Používá se k určení počtu úloh, které se mají spustit současně. Pokud poskytneme mnoho možností '-j', bude se považovat za provedení poslední z nich. Pokud neuvedeme počet úloh, neomezí to úlohy, které mohou běžet současně.-k, --pokračuji:Slouží k co největšímu pokračování programu po získání chyby.-l [zatížení], --průměrné zatížení[=zatížení]:Používá se k určení, že by se neměla spouštět žádná nová úloha, pokud jsou ve frontě jiné úlohy a průměrná zátěž je na minimu.-n, --just-print, --dry-run, --recon:Slouží k zobrazení příkazu, který bude spuštěn.-o soubor, --old-file=soubor, --assume-old=soubor:Používá se k zajištění toho, že značka nepředělá soubor, i když je starší než jeho závislosti.-O[typ], --output-sync[=typ]:Používá se k potvrzení, že výstup každého úkolu je sestaven spíše než smíšený výstup jiných úkolů. Je to užitečné pro zpracování více úloh s volbou '-j'.-p, --print-data-base:Používá se k tisku databáze, která se vytváří po přečtení makefiles. Je také užitečné vytisknout informace o verzi při použití s ​​volbou '-v'. Chcete-li vytisknout databázi bez pokusu o předělání souborů, spusťte příkaz následovně:
    make -p -f/dev/null.-q, -- otázka:Volba '-q' se používá pro Režim otázky. Nespustí žádný příkaz ani nic nevytiskne. Pokud je zadaný cíl již synchronizován, vrátí návratový stav nula; jinak se zobrazí nenulový výstupní stav.-r, --no-builtin-rules:Používá se k vyloučení použití vestavěných implicitních pravidel.-R, --no-builtin-variables:Hodí se, pokud nechceme definovat žádnou vestavěnou proměnnou.-s, --tichý, --tichý:Tyto možnosti se nazývají Tichý provoz. Omezuje tisk příkazů při jejich provádění.-S, --ne-pokračovat, --stop:Používá se ke zrušení efektu operace '-k, --keep-going'.-t, --touch:Používá se k dotyku souborů namísto spouštění jejich příkazů.--stopa:Používá se ke sledování dispozice každého cíle.-v, --verze:Slouží k tisku nainstalované verze nástroje make. Dále zobrazuje seznam autorů, autorská práva a některá upozornění týkající se nástroje make.-w, --print-adresář:Používá se ke sledování tiskové zprávy, která obsahuje pracovní adresář před a po dalším zpracování. Je užitečné vysledovat chyby ze složité struktury rekurzivního příkazu make.--no-print-adresář:Používá se k vypnutí volby '-w'.-W soubor, --what-if=soubor, --new-file=soubor, --assume-new=soubor:Tyto možnosti předstírají, že byl cílový soubor právě upraven.--warn-undefined-variables:Tato možnost se používá k upozornění, že se odkazuje na nedefinovanou proměnnou.

Pojďme pochopit několik příkladů příkazu make. Uvidíme základní použití makefile a dále vytvoříme některé programy v c++ a makefile. Provedeme na nich některé operace, abychom lépe porozuměli příkazu make.

převést int na řetězec c++

Základní použití příkazu make

Pojďme pochopit velmi základní použití příkazu make a může vám pomoci pochopit, jak funguje.

Vytvořte adresář 'projekt' a změňte do něj adresář. Zvažte níže uvedené příkazy:

 mkdir project cd project 

Nyní vytvořte a 'Makefile' s následujícím obsahem pro první program:

 say_hello: echo 'Hello World!' 

Z výše uvedeného souboru je say_hello cíl, který se chová jako funkce v jakémkoli programovacím jazyce a echo bude považováno za akci. Je třeba mít na paměti, že akce by měla být zapsána pomocí a TAB. Cíl a akce společně vytvářejí pravidlo pro makefile. Nyní proveďte příkaz make takto:

matematické metody v Javě

Zvažte následující výstup:

Příkaz make pro Linux

Z výše uvedeného výstupu můžeme vidět, jak se zobrazuje samotná operace echa. Pokud nechceme na výstupu zobrazit příkaz echo, proveďte echo počínaje '@' symbol. Chcete-li potlačit ozvěnu, aktualizujte obsah makefile následovně:

 say_hello: @echo 'Hello World!' 

Zvažte následující výstup:

Příkaz make pro Linux

Cíl může být binární soubor, který závisí na akcích.

Pojďme přidat několik dalších cílů, jako je generování a seznam v makefile. Aktualizujte makefile následovně:

 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Pokud provedeme příkaz make, provede se pouze první cíl, protože je výchozím cílem souboru makefile. Zvažte následující výstup:

Příkaz make pro Linux

Výchozí cíl můžeme změnit zahrnutím níže uvedeného obsahu do našeho souboru makefile:

 .DEFAULT_GOAL := generate 

Přidejte jej na první řádek souboru následovně:

Příkaz make pro Linux

Výše uvedený makefile bude považovat 'generovat' za výchozí cíl. Proveďte příkaz make a ten dá výstup takto:

Příkaz make pro Linux

Možnost DEFAULT GOAL (VÝCHOZÍ CÍL) provede pouze jeden cíl pro určení více než jednoho cíle pro použití všech možností. Chcete-li zadat více než jeden cíl, aktualizujte první řádek souboru makefile následovně:

 all: say_hello generate 

Provede zadaný cíl. Zvažte následující výstup:

Příkaz make pro Linux

Existuje další možnost, která nám umožňuje provést všechny cíle. Pokud chceme spustit všechny cíle makefile, aktualizujeme soubor následovně:

 .PHONY: all say_hello generate list say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

Výše uvedený soubor provede všechny zadané cíle. Spusťte příkaz make, zvažte následující výstup:

Příkaz make pro Linux

Pokročilé použití příkazu make

Vytvořme C++ projekt se soubory main.cpp, function1.cpp, function2.cpp a závislostním souborem function.h.

Kód souborů je následující:

řetězec najít c++

main.cpp:

 #include #include 'functions.h' int main() { print_hello(); std::cout<< std::endl; std::cout<< 'The factorial of 5 is' << factorial(5) << std:: endl; return 0; } 

function1.cpp:

 #include 'functions.h' int factorial(int n) { if(n!=1) { return (n * factorial(n-1)); } else return 1; } 

function2.cpp:

 #include #include 'functions.h' void print_hello() { std::cout << 'Hello World'; } 

funkce.h:

 void print_hello(); int factorial (int n); 

Nyní vytvořte spustitelný soubor výše uvedeného projektu provedením níže uvedeného příkazu:

 g++ main.cpp function1.cpp function2.cpp -o hello 

Výše uvedený příkaz vytvoří spustitelný soubor 'Ahoj' ze souborů main.cpp, function1.cpp a function2.cpp.

Zvažte následující výstup:

Příkaz make pro Linux

Z výše uvedeného výstupu, pokud je úspěšně proveden, neposkytne žádný výstup.

Proveďme stejný úkol pomocí makefile.

Vytvořte soubor jako Makefile a vložte do něj níže uvedený kód.

 all: g++ main.cpp function1.cpp function2.cpp -o hello 

Klíčové slovo all se používá pro cíl a na nový řádek zadejte stejný příkaz s TAB jako výše, abyste specifikovali operaci. Uložte soubor. Zvažte níže uvedený soubor:

Příkaz make pro Linux

Chcete-li pracovat, proveďte příkaz následovně:

unixový top příkaz
 make 

Výše uvedený příkaz vytvoří spustitelný soubor 'hello' ze zadaných souborů. Zvažte následující výstup:

Příkaz make pro Linux

Pojďme přidat nějaké další úkoly do Makefile. Přidejte úkol 'kompilovat' jak následuje:

 all: compile: g++ main.cpp function1.cpp function2.cpp -o hello 

K provedení úkolu kompilovat, proveďte níže uvedený příkaz:

 make compile 

Výše uvedený příkaz provede úlohu kompilace. Zvažte následující výstup:

Příkaz make pro Linux

Pojďme provést nějaké další úkoly do našeho souboru makefile.

aktualizujte Makefile následovně:

 all: hello hello: main.o function1.o function2.o g++ main.o function1.o function2.o -o hello main.o: main.cpp g++ -c main.cpp function1.o: function1.cpp g++ -c function1.cpp function2.o: function2.cpp g++ -c function2.cpp clean: rm -rf *o hello 

Z výše uvedeného makefile jsme vytvořili tři objekty jako main.o, function1.o a function2.o. Dále jsme poskytli závislosti pro cíle main.o, function1.o a function2.o jako main.cpp, function1.cpp a function2.cpp. Všechny cíle v něm budou plnit zadané úkoly. Také jsme určili čistý cíl pro vyčištění všech závislostí a odstranění spustitelného souboru.

Nyní spusťte příkaz make all pro spuštění našeho nového souboru makefile.

 make all 

Zvažte následující výstup:

Příkaz make pro Linux

Z výše uvedeného výstupu můžeme vidět, že příkaz nejprve provedl main.o, function1.o a function2.o. Vytvoří spustitelný soubor a soubor objektů daných souborů. Nevykoná čistý cíl, protože jsme jej nezadali v hello. Zvažte níže uvedené soubory:

Příkaz make pro Linux

Příkaz make má přímočarý pracovní proces. Provedlo to all option a přešlo na ahoj. Po provedení hello přečetl cíl v zadané sekvenci. Prohledal každý cíl a jeho závislosti a provedl je v pořadí.

Chcete-li odebrat objekty a spustitelný soubor, proveďte úlohu čištění. Chcete-li provést úlohu čištění, spusťte příkaz následovně:

 make clean 

Zvažte následující výstup:

Příkaz make pro Linux

Výše uvedený příkaz odstraní všechny objekty a spustitelné soubory. Podívejte se na níže uvedený snímek adresáře:

Příkaz make pro Linux

Z obrázku výše vidíme, že jsme vyčistili náš adresář.

Proměnné v příkazu make

Proměnné můžeme definovat v našem makefile. Chcete-li definovat proměnné, použijte '=' operátor. Pokud například chceme vytvořit proměnnou A a přiřadit k ní příkaz gcc, přiřaďte ji jako:

převod řetězce na objekt json
 A=g++ 

Použijte jej následovně v našem makefile:

 hello: hello.cpp ${A} hello.cpp -o hello 

Do terminálu se předává jako:

 g++ hello.cpp -o hello 

Můžeme použít $(A) místo ${A}, protože s oběma zachází skript stejně.

Komentáře v makefile

Chcete-li přidat komentář do souboru makefile, použijte '#' symbol. Chcete-li například přidat komentář do sekce kompilace, přidejte jej jako '# Tím se zkompiluje program .' Komentáře jsou kompilátorem ignorovány.