logo

Linux make ukaz

Linux narediti ukaz se uporablja za gradnjo in vzdrževanje skupin programov in datotek iz izvorne kode. V Linuxu je to eden najpogosteje uporabljenih ukazov razvijalcev. Razvijalcem pomaga pri namestitvi in ​​prevajanju številnih pripomočkov s terminala. Poleg tega upravlja postopek kompilacije velikih projektov. Prihrani čas kompilacije.

Glavni motiv ukaza make je razdeliti velik program na dele in preveriti, ali ga je treba znova prevesti ali ne. Prav tako izda potrebna naročila za njihovo ponovno prevajanje.

V tem razdelku bomo uporabljali programe C++, saj je programski jezik C++ objektno usmerjen jezik, vendar lahko uporabite kateri koli jezik, nameščen na vašem računalniku. Ni omejeno le na programe; lahko ga uporabimo tudi za opis drugih nalog.

Kako deluje ukaz make?

Ukaz make vzame cilje kot argumente. Ti argumenti so navedeni v 'Makefile'. Makefile vsebuje cilje in povezana dejanja, povezana s temi cilji.

Ko izvedemo ukaz make, poišče makefile in ga pregleda, da najde cilj in dostopa do njegovih odvisnosti. Če odvisnosti niso podane, bo poiskal odvisnost in jo zgradil. Zgradil bo glavni cilj, potem ko bodo zgrajene odvisnosti.

Na primer, če želimo spremeniti samo eno izvorno datoteko in izvedemo ukaz make; tako bo to prevedlo samo objektno datoteko, ki je povezana s to izvorno datoteko. To bo prihranilo veliko časa pri končnem sestavljanju projekta.

Kaj je Makefile?

Ukaz make prikliče izvedbo makefile. Gre za posebno datoteko, ki vsebuje lupinske ukaze, ki jih ustvarimo za vzdrževanje projekta. Makefile vsebuje cilje in ukaze za izvajanje. Ni dovoljeno ustvariti več kot ene datoteke makefile. Priporočljivo je, da zanj ustvarite ločen imenik.

Sledi nedavnim datotekam, zato posodobite samo tiste datoteke, ki so potrebne. Če imamo velik program z veliko izvornimi datotekami, moramo znova prevesti vse odvisne datoteke. Torej je lahko zelo dolgotrajen postopek.

Makefile ima seznam standardov. Ti standardi so v pomoč sistemu, da razume, kateri ukaz želimo izvesti. Ti standardi so v dveh delih in ločeni z novo vrstico. Prva vrstica je linija odvisnosti, in naslednje vrstice se štejejo kot dejanja ali ukaz s. Ukazi so ločeni z zavihkom v novi vrstici.

The odvisnosti določite razmerje vsake datoteke z izvornimi datotekami. In tarča je izvršljiva datoteka in se ustvari po izvedbi ukaza make.

Opcije

Ukaz make olajša različne možnosti, da je bolj specifičen. Nekatere pomembne možnosti so naslednje:

    -b, -m:Te možnosti se uporabljajo za ignoriranje združljivosti za različne različice ukaza make.-B, --vedno naredi:Te možnosti se uporabljajo za brezpogojno doseganje vseh ciljev.-C imenik, --imenik=imenik:Te možnosti se uporabljajo za spreminjanje imenika pred izvedbo makefilea.-d:Uporablja se za tiskanje informacij o odpravljanju napak.--debug[=ZASTAVE]:Uporablja se za tiskanje informacij o odpravljanju napak skupaj z običajno obdelavo. Če zastavico preskočimo, bo prikazal podobne rezultate kot možnost '-d'.-e, --preglasi okolje:Uporablja se za zagotavljanje spremenljivk, vzetih iz prednosti okolja v datoteko makefile.-f datoteka, --file=datoteka, --makefile=DATOTEKA:Uporablja se za uporabo datoteke kot makefile.-i, --ignore-napake:Možnost '-i' se uporablja za prezrtje vseh napak v ukazih.-I dir, --include-dir=dir:Uporablja se za določitev imenika za iskanje podane makefile. Če določimo več možnosti '-I', bo iskal v številnih imenikih v navedenem vrstnem redu.-j [opravila], --opravila [=opravila]:Uporablja se za določitev števila opravil, ki se izvajajo hkrati. Če ponudimo več možnosti '-j', bo zadnja veljala za izvedbo. Če ne podamo števila opravil, to ne bo omejilo opravil, ki se lahko izvajajo hkrati.-k, --nadaljuj:Uporablja se za nadaljevanje programa čim dlje po pojavu napake.-l [obremenitev], --load-povprečje[=obremenitev]:Uporablja se za določitev, da se ne sme zagnati nobena nova naloga, če so druga opravila v čakalni vrsti in je povprečje obremenitve najmanjše.-n, --just-print, --dry-run, --recon:Uporablja se za prikaz ukaza, ki bi se izvedel.-o datoteka, --old-file=datoteka, --assume-old=datoteka:Uporablja se za zagotovitev, da make ne bo preoblikoval datoteke, tudi če je starejša od svojih odvisnosti.-O[vrsta], --output-sync[=vrsta]:Uporablja se za potrditev, da je izhod vsake naloge sestavljen skupaj, ne pa za medsebojno pomešan izhod drugih nalog. Uporaben je za obdelavo več opravil z možnostjo '-j'.-p, --print-baza-podatkov:Uporablja se za tiskanje baze podatkov, ki se ustvari po branju datotek makefile. Prav tako je koristno natisniti informacije o različici, če se uporablja z možnostjo '-v'. Če želite natisniti bazo podatkov, ne da bi poskušali predelati katero koli datoteko, izvedite ukaz, kot sledi:
    make -p -f/dev/null.-q, --vprašanje:Možnost '-q' se uporablja za Način vprašanj. Ne bo izvedel nobenega ukaza ali natisnil ničesar. Izhodni status bo vrnil le nič, če je podani cilj že sinhroniziran; sicer bo prikazal izhodni status, ki ni enak nič.-r, --no-builtin-rules:Uporablja se za odpravo uporabe vgrajenih implicitnih pravil.-R, --no-builtin-variables:Uporabno je, če ne želimo definirati nobene vgrajene spremenljivke.-s, --tiho, --tiho:Te možnosti se imenujejo Tiho delovanje. Omejuje tiskanje ukazov, ko se izvajajo.-S, --no-keep-going, --stop:Uporablja se za preklic učinka operacije '-k, --keep-going'.-t, --dotik:Uporablja se za dotik datotek namesto izvajanja njihovih ukazov.--sled:Uporablja se za sledenje razporeditvi vsake tarče.-v, --različica:Uporablja se za tiskanje nameščene različice pripomočka make. Poleg tega prikaže seznam avtorjev, avtorskih pravic in nekaj obvestil o pripomočku make.-w, --print-imenik:Uporablja se za sledenje tiskanemu sporočilu, ki vsebuje delovni imenik pred in po drugi obdelavi. Koristno je izslediti napake zaradi zapletene strukture rekurzivnega ukaza make.--no-print-directory:Uporablja se za izklop možnosti '-w'.-W datoteka, --what-if=datoteka, --new-file=datoteka, --assume-new=datoteka:Te možnosti se pretvarjajo, da je bila ciljna datoteka pravkar spremenjena.--opozorilo-nedefiniranih-spremenljivk:Ta možnost se uporablja za opozorilo, da se sklicuje na nedefinirano spremenljivko.

Razumejmo nekaj primerov ukaza make. Ogledali si bomo osnovno uporabo makefilea, nadalje pa bomo ustvarili nekaj programov v C++ in makefile. Na njih bomo izvedli nekaj operacij, da bomo bolje razumeli ukaz make.

opozorilno polje javascript

Osnovna uporaba ukaza make

Spoznajmo zelo osnovno uporabo ukaza make in morda vam bo pomagal razumeti, kako deluje.

Ustvarite 'projekt' imenika in ga spremenite v imenik. Upoštevajte spodnje ukaze:

 mkdir project cd project 

Zdaj ustvarite a 'Makefile' z naslednjo vsebino za prvi program:

koliko filmov misija nemogoče je
 say_hello: echo 'Hello World!' 

Iz zgornje datoteke je say_hello cilj, ki se obnaša kot funkcija v katerem koli programskem jeziku, odmev pa bo obravnavan kot dejanje. Ne smemo pozabiti, da je treba dejanje napisati z uporabo a TAB. Cilj in dejanje skupaj ustvarita pravilo za makefile. Zdaj izvedite ukaz make na naslednji način:

Razmislite o spodnjem rezultatu:

Linux make ukaz

Iz zgornjega izhoda lahko vidimo, da se prikazuje sama operacija odmeva. Če na izhodu ne želimo prikazati ukaza echo, izvedemo echo, ki se začne z '@' simbol. Če želite zatreti odmev, posodobite vsebino makefile na naslednji način:

 say_hello: @echo 'Hello World!' 

Razmislite o spodnjem rezultatu:

Linux make ukaz

Cilj je lahko binarna datoteka, ki je odvisna od dejanj.

Dodajmo še nekaj ciljev, kot sta generiranje in seznam v makefile. Posodobite makefile na naslednji način:

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

Če izvedemo ukaz make, izvede samo prvi cilj, ker je to privzeti cilj makefile. Razmislite o spodnjem rezultatu:

Linux make ukaz

Privzeti cilj lahko spremenimo tako, da v našo makefile vključimo spodnjo vsebino:

 .DEFAULT_GOAL := generate 

Dodajte ga v prvo vrstico datoteke na naslednji način:

Linux make ukaz

Zgornji makefile bo kot privzeti cilj upošteval 'generiranje'. Izvedite ukaz make in rezultat bo naslednji:

Linux make ukaz

Možnost PRIVZETI CILJ bo izvedla samo en cilj, če želite določiti več kot en cilj za uporabo vseh možnosti. Če želite določiti več kot en cilj, posodobite prvo vrstico makefile, kot sledi:

 all: say_hello generate 

Izvedel bo podani cilj. Razmislite o spodnjem rezultatu:

Linux make ukaz

Obstaja še ena možnost, ki nam omogoča, da izpolnimo vse cilje. Če želimo izvesti vse cilje makefilea, posodobimo datoteko na naslednji način:

 .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 

Zgornja datoteka bo izvedla vse navedene cilje. Izvedite ukaz make, upoštevajte spodnji rezultat:

Linux make ukaz

Napredna uporaba ukaza make

Ustvarimo projekt C++ z datotekami main.cpp, function1.cpp, function2.cpp in datoteko odvisnosti function.h.

Koda datotek je naslednja:

java vzorčna koda

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; } 

funkcija1.cpp:

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

funkcija2.cpp:

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

funkcije.h:

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

Zdaj ustvarite izvedljivo datoteko zgornjega projekta z izvedbo spodnjega ukaza:

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

Zgornji ukaz bo ustvaril izvršljivo datoteko 'zdravo' datotek main.cpp, function1.cpp in function2.cpp.

Razmislite o spodnjem rezultatu:

Linux make ukaz

Iz zgornjega izhoda, če je uspešno izveden, ne bo dal nobenega izhoda.

Izvedimo isto nalogo z uporabo makefile.

Ustvarite datoteko kot Makefile in vanj vstavite spodnjo kodo.

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

Ključna beseda all se uporablja za cilj in v novo vrstico postavite isti ukaz s TAB kot zgoraj, da določite operacijo. Shranite datoteko. Razmislite o spodnji datoteki:

Linux make ukaz

Za delovanje izvedite ukaz na naslednji način:

vrste zanke for
 make 

Zgornji ukaz bo ustvaril izvršljivo datoteko 'hello' navedenih datotek. Razmislite o spodnjem rezultatu:

Linux make ukaz

Dodajmo še nekaj nalog v Makefile. Dodajte nalogo 'sestaviti' kot sledi:

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

Za izvedbo naloge prevajati, izvedite spodnji ukaz:

 make compile 

Zgornji ukaz bo izvedel nalogo prevajanja. Razmislite o spodnjem rezultatu:

Linux make ukaz

Opravimo še nekaj nalog v naši makefile.

posodobite Makefile na naslednji način:

 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 

Iz zgornje make-datoteke smo ustvarili tri objekte kot main.o, function1.o in function2.o. Poleg tega smo zagotovili odvisnosti za cilje main.o, function1.o in function2.o kot main.cpp, function1.cpp in function2.cpp. Vse tarče bodo v njem izvajale določene naloge. Določili smo tudi čisti cilj za čiščenje vseh odvisnosti in odstranitev izvršljive datoteke.

Zdaj izvedite ukaz make all, da izvedete našo novo datoteko make.

 make all 

Razmislite o spodnjem rezultatu:

Linux make ukaz

Iz zgornjega izhoda lahko vidimo, da je ukaz najprej izvedel main.o, function1.o oziroma function2.o. Ustvaril bo izvršljivo datoteko in datoteko predmetov danih datotek. Ne bo izvedel čistega cilja, ker ga nismo navedli v hello. Razmislite o spodnjih datotekah:

Linux make ukaz

Ukaz make ima enostaven delovni proces. Izvedel je vse možnosti in šel na pozdrav. Po izvedbi ukaza hello prebere cilj v določenem zaporedju. Preiskal je vsak cilj in njegovo odvisnost ter jih izvršil v zaporedju.

Če želite odstraniti predmete in izvršljivo datoteko, izvedite opravilo čiščenja. Za izvedbo čistega opravila izvedite ukaz na naslednji način:

 make clean 

Razmislite o spodnjem rezultatu:

Linux make ukaz

Zgornji ukaz bo odstranil vse predmete in izvršljive datoteke. Oglejte si spodnji posnetek imenika:

Linux make ukaz

Iz zgornje slike lahko vidimo, da smo očistili naš imenik.

Spremenljivke v ukazu make

Spremenljivke lahko definiramo v naši makefile. Če želite definirati spremenljivke, uporabite '=' operater. Na primer, če želimo ustvariti spremenljivko A in ji dodeliti ukaz gcc, jo dodelite kot:

pretvorba niza v objekt json
 A=g++ 

Uporabite ga v naši makefile na naslednji način:

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

Na terminal se posreduje kot:

 g++ hello.cpp -o hello 

Namesto ${A} lahko uporabimo $(A), saj skript oba obravnava enako.

Komentarji v makefile

Če želite dodati komentar v makefile, uporabite '#' simbol. Če želite na primer dodati komentar v razdelek za prevajanje, ga dodajte kot '# To bo prevedlo program .' Prevajalnik ignorira komentarje.