logo

Linux make naredba

Linux napraviti naredba se koristi za izgradnju i održavanje grupa programa i datoteka iz izvornog koda. U Linuxu je to jedna od najčešće korištenih naredbi programera. Pomaže programerima da instaliraju i kompiliraju mnoge pomoćne programe s terminala. Nadalje, upravlja procesom kompilacije velikih projekata. Štedi vrijeme kompilacije.

Glavni motiv naredbe make je razdvojiti veliki program na dijelove i provjeriti treba li ga ponovno prevesti ili ne. Također, izdaje potrebne naredbe za njihovo ponovno kompajliranje.

U ovom odjeljku koristit ćemo C++ programe budući da je C++ programski jezik objektno orijentiran jezik, ali možete koristiti bilo koji jezik instaliran na vašem računalu. Nije ograničen samo na programe; možemo ga koristiti i za opisivanje drugih zadataka.

Kako radi naredba make?

Naredba make uzima ciljeve kao argumente. Ovi argumenti navedeni su u 'Makefile'. Makefile sadrži ciljeve kao i pridružene akcije povezane s tim ciljevima.

Kada izvršimo naredbu make, ona traži makefile i skenira ga kako bi pronašla cilj i pristupila njegovim ovisnostima. Ako ovisnosti nisu navedene, tražit će ovisnost i izgradit će je. Izgradit će glavni cilj nakon što se izgrade ovisnosti.

Na primjer, ako želimo promijeniti samo jednu izvornu datoteku i izvršimo naredbu make; tako da će ovo prevesti samo objektnu datoteku koja je povezana s tom izvornom datotekom. To će uštedjeti puno vremena u konačnoj kompilaciji projekta.

Što je Makefile?

Naredba make poziva izvršenje makefilea. To je posebna datoteka koja sadrži naredbe ljuske koje stvaramo za održavanje projekta. Makefile sadrži ciljeve i naredbe za izvršenje. Nije dopušteno kreirati više od jednog makefilea. Preporuča se stvoriti zaseban direktorij za njega.

Prati nedavne datoteke, stoga ažurirajte samo one datoteke koje su potrebne. Ako imamo velik program s mnogo izvornih datoteka, moramo ponovno prevesti sve ovisne datoteke. Dakle, to može biti vrlo dugotrajan proces.

Makefile ima popis standarda. Ovi standardi pomažu sustavu da razumije koju naredbu želimo izvršiti. Ovi standardi su u dva dijela i odvojeni novim retkom. Prvi red je linija zavisnosti, a sljedeći se redovi smatraju akcije ili naredbe s. Naredbe su odvojene tabulatorom u novom retku.

The ovisnosti odredite odnos svake datoteke s izvornim datotekama. i cilj je izvršna datoteka, a kreira se nakon izvršenja naredbe make.

Mogućnosti

Naredba make olakšava razne opcije kako bi ga učinili specifičnijim. Neke važne opcije su sljedeće:

    -b, -m:Ove se opcije koriste za ignoriranje kompatibilnosti za različite verzije naredbe make.-B, --uvijek-napravi:Ove se opcije koriste za bezuvjetno postavljanje svih ciljeva.-C direktorij, --direktorij=dir:Ove se opcije koriste za promjenu direktorija prije izvođenja makefilea.-d:Koristi se za ispis informacija o otklanjanju pogrešaka.--debug[=ZASTAVICE]:Koristi se za ispis informacija o otklanjanju pogrešaka zajedno s normalnom obradom. Ako preskočimo oznaku, pokazat će slične rezultate kao opcija '-d'.-e, --nadjačavanja okruženja:Koristi se za pružanje varijabli preuzetih iz prioriteta okruženja u makefile.-f datoteka, --file=datoteka, --makefile=DATOTEKA:Koristi se za korištenje datoteke kao makefile.-i, --ignore-greške:Opcija '-i' koristi se za ignoriranje svih grešaka u naredbama.-I dir, --include-dir=dir:Koristi se za određivanje direktorija za traženje navedene make datoteke. Ako navedemo mnogo opcija '-I', pretraživat će se u mnogim direktorijima navedenim redoslijedom.-j [poslovi], --poslovi[=poslovi]:Koristi se za određivanje broja poslova koji će se izvoditi istovremeno. Ako pružimo više opcija '-j', posljednja će se smatrati izvršenom. Ako ne navedemo broj poslova, to neće ograničiti poslove koji se mogu izvoditi istovremeno.-k, --nastavi:Koristi se za nastavak programa što je više moguće nakon dobivanja pogreške.-l [učitavanje], --load-prosjek[=učitavanje]:Koristi se za određivanje da se novi zadatak ne smije pokretati ako su drugi zadaci u redu i ako je prosjek učitavanja na minimumu.-n, --just-print, --dry-run, --recon:Koristi se za prikaz naredbe koja bi se pokrenula.-o datoteka, --old-file=datoteka, --assume-old=datoteka:Koristi se kako bi se osiguralo da make neće ponovno izraditi datoteku čak i ako je starija od svojih ovisnosti.-O[vrsta], --output-sync[=vrsta]:Koristi se za potvrdu da je izlaz svakog zadatka sastavljen zajedno, a ne isprepleteni izlaz drugih zadataka. Korisno je za obradu više poslova s ​​opcijom '-j'.-p, --print-baza-podataka:Koristi se za ispis baze podataka koja se proizvodi nakon čitanja make datoteka. Također je korisno ispisati informacije o verziji kada se koristi s opcijom '-v'. Za ispis baze podataka bez pokušaja ponovnog kreiranja datoteka, izvršite naredbu na sljedeći način:
    make -p -f/dev/null.-q, --pitanje:Opcija '-q' koristi se za Način pitanja. Neće pokrenuti nikakvu naredbu niti ispisati bilo što. Vratit će izlazni status nula samo ako je navedeni cilj već sinkroniziran; u suprotnom će prikazati izlazni status različit od nule.-r, --no-builtin-rules:Koristi se za uklanjanje upotrebe ugrađenih implicitnih pravila.-R, --no-builtin-variables:Korisno je ako ne želimo definirati nikakvu ugrađenu varijablu.-s, --tiho, --tiho:Ove opcije se nazivaju Tihi rad. Ograničava ispis naredbi dok se izvršavaju.-S, --no-keep-going, --stop:Koristi se za poništavanje učinka operacije '-k, --keep-going'.-t, --dodir:Koristi se za dodirivanje datoteka umjesto pokretanja njihovih naredbi.--trag:Koristi se za praćenje rasporeda svake mete.-v, --verzija:Koristi se za ispis instalirane verzije uslužnog programa make. Nadalje, prikazuje popis autora, autorskih prava i neke obavijesti u vezi s uslužnim programom make.-w, --print-direktorij:Koristi se za praćenje ispisne poruke koja sadrži radni direktorij prije i nakon druge obrade. Korisno je pronaći pogreške iz komplicirane strukture rekurzivne make naredbe.--no-print-directory:Koristi se za isključivanje opcije '-w'.-W datoteka, --what-if=datoteka, --new-file=datoteka, --assume-new=datoteka:Ove opcije pretvaraju se da je ciljna datoteka upravo izmijenjena.--upozorenje-nedefinirane-varijable:Ova se opcija koristi za upozorenje da se referencira nedefinirana varijabla.

Razmotrimo neke primjere naredbe make. Vidjet ćemo osnovnu upotrebu makefilea, a nadalje, izradit ćemo neke C++ programe i makefile. Izvest ćemo neke operacije na njima kako bismo bolje razumjeli naredbu make.

b plus drvo

Osnovna upotreba naredbe make

Hajdemo razumjeti vrlo osnovnu upotrebu naredbe make i to bi vam moglo pomoći da shvatite kako funkcionira.

Napravite 'projekt' direktorija i promijenite direktorij u njega. Razmotrite sljedeće naredbe:

rezanje java
 mkdir project cd project 

Sada stvorite a 'Makefile' ima sljedeći sadržaj za prvi program:

 say_hello: echo 'Hello World!' 

Iz gornje datoteke, say_hello je cilj koji se ponaša kao funkcija u bilo kojem programskom jeziku, a echo će se smatrati radnjom. Morate imati na umu da radnju treba pisati pomoću a TAB. Cilj i akcija zajedno stvaraju pravilo za makefile. Sada izvršite naredbu make na sljedeći način:

Razmotrite donji izlaz:

Linux make naredba

Iz gornjeg izlaza možemo vidjeti da se prikazuje sama operacija odjeka. Ako ne želimo prikazati naredbu echo na izlazu, izvršimo echo počevši s '@' simbol. Za suzbijanje jeke ažurirajte sadržaj makefile-a na sljedeći način:

 say_hello: @echo 'Hello World!' 

Razmotrite donji izlaz:

Linux make naredba

Cilj može biti binarna datoteka koja ovisi o radnjama.

Dodajmo još nekoliko ciljeva, poput generiranja i popisa u make datoteci. Ažurirajte makefile na sljedeći način:

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

Ako izvršimo naredbu make, ona izvršava samo prvi cilj jer je to zadani cilj makefilea. Razmotrite donji izlaz:

Linux make naredba

Možemo promijeniti zadani cilj uključivanjem sadržaja ispod u našu make datoteku:

 .DEFAULT_GOAL := generate 

Dodajte ga u prvi redak datoteke na sljedeći način:

Linux make naredba

Gornji makefile smatrat će 'generiranje' kao zadani cilj. Izvršite make naredbu i ona će dati sljedeći izlaz:

Linux make naredba

Opcija DEFAULT GOAL izvršit će samo jedan cilj kako bi odredila više od jednog cilja za korištenje svih opcija. Za navođenje više od jednog cilja, ažurirajte prvi redak makefile-a na sljedeći način:

 all: say_hello generate 

Izvršit će navedeni cilj. Razmotrite donji izlaz:

Linux make naredba

Postoji još jedna opcija koja nam omogućuje da izvršimo sve ciljeve. Ako želimo izvršiti sve ciljeve makefilea, ažurirajte datoteku na sljedeći 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 

Gornja datoteka izvršit će sve navedene ciljeve. Izvršite make naredbu, razmotrite donji izlaz:

Linux make naredba

Napredno korištenje naredbe make

Kreirajmo C++ projekt s datotekama main.cpp, function1.cpp, function2.cpp i datotekom ovisnosti function.h.

Kod datoteka je sljedeći:

c niz u nizu

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

funkcija2.cpp:

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

funkcije.h:

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

Sada stvorite izvršnu datoteku gornjeg projekta izvršavanjem donje naredbe:

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

Gornja naredba će stvoriti izvršnu datoteku 'zdravo' datoteka main.cpp, function1.cpp i function2.cpp.

Razmotrite donji izlaz:

Linux make naredba

Iz gornjeg izlaza, ako se uspješno izvede, neće dati nikakav izlaz.

Izvršimo isti zadatak koristeći makefile.

Stvorite datoteku kao Makefile i u njega stavite donji kod.

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

Ključna riječ all koristi se za cilj, au novom retku stavite istu naredbu s TAB-om kao gore da odredite operaciju. Spremite datoteku. Razmotrite datoteku u nastavku:

Linux make naredba

Za rad izvršite naredbu na sljedeći način:

je odnos
 make 

Gornja naredba će stvoriti izvršnu datoteku 'hello' od navedenih datoteka. Razmotrite donji izlaz:

Linux make naredba

Dodajmo još neke zadatke u Makefile. Dodajte zadatak 'sastaviti' kako slijedi:

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

Za izvršenje zadatka sastaviti, izvršite naredbu ispod:

 make compile 

Gornja naredba će izvršiti zadatak prevođenja. Razmotrite donji izlaz:

Linux make naredba

Izvršimo još neke zadatke na našem makefileu.

ažurirajte Makefile na sljedeći 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 gornjeg makefilea stvorili smo tri objekta kao main.o, function1.o i function2.o. Nadalje, dali smo ovisnosti za ciljeve main.o, function1.o i function2.o kao main.cpp, function1.cpp i function2.cpp. Sve će mete unutar njega obavljati navedene zadatke. Također smo naveli čisti cilj za čišćenje svih ovisnosti i uklanjanje izvršne datoteke.

Sada izvršite naredbu make all da biste izvršili naš novi makefile.

 make all 

Razmotrite donji izlaz:

Linux make naredba

Iz gornjeg izlaza možemo vidjeti da je naredba prvo izvršila main.o, function1.o i function2.o. Stvorit će izvršnu i objektnu datoteku zadanih datoteka. Neće izvršiti čisti cilj jer ga nismo naveli u pozdravu. Razmotrite donje datoteke:

Linux make naredba

Naredba make ima jednostavan radni proces. Izvršio je sve opcije i otišao na hello. Nakon izvršenja hello, čita cilj u navedenom nizu. Pretražio je svaki cilj i njegovu ovisnost i izvršio ih u nizu.

Da biste uklonili objekte i izvršnu datoteku, izvedite zadatak čišćenja. Da biste izvršili zadatak čišćenja, izvršite naredbu na sljedeći način:

 make clean 

Razmotrite donji izlaz:

Linux make naredba

Gornja naredba će ukloniti sve objekte i izvršne datoteke. Pogledajte donji snimak imenika:

Linux make naredba

Iz gornje slike možemo vidjeti da smo očistili naš imenik.

Varijable u make naredbi

Možemo definirati varijable u našoj make datoteci. Za definiranje varijabli koristite '=' operater. Na primjer, ako želimo stvoriti varijablu A i dodijeliti joj naredbu gcc, dodijelite je kao:

kako sortirati arraylist u Javi
 A=g++ 

Koristite ga na sljedeći način u našoj make datoteci:

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

Na terminal se prosljeđuje kao:

 g++ hello.cpp -o hello 

Možemo upotrijebiti $(A) umjesto ${A}, budući da skript tretira oboje.

Komentari u makefileu

Za dodavanje komentara u makefile, koristite '#' simbol. Na primjer, da biste dodali komentar u odjeljak sastavljanja, dodajte ga kao '# Ovo će kompilirati program .' Prevoditelj zanemaruje komentare.