logo

Linux make command

Linux-ul face comanda este folosită pentru a construi și menține grupuri de programe și fișiere din codul sursă. În Linux, este una dintre cele mai frecvent utilizate comenzi de către dezvoltatori. Acesta ajută dezvoltatorii să instaleze și să compileze multe utilitare de pe terminal. În plus, se ocupă de procesul de compilare a proiectelor importante. Economisește timpul de compilare.

Motivul principal al comenzii make este de a determina un program mare în părți și de a verifica dacă trebuie să fie recompilat sau nu. De asemenea, emite ordinele necesare pentru a le recompila.

În această secțiune, vom folosi programe C++, deoarece limbajul de programare C++ este un limbaj orientat pe obiecte, dar puteți folosi orice limbaj instalat pe mașina dvs. Nu se limitează doar la programe; îl putem folosi pentru a descrie și alte sarcini.

Cum funcționează comanda make?

Comanda make ia ținte ca argumente. Aceste argumente sunt specificate în „Makefile”. Makefile conține țintele, precum și acțiunile asociate legate de aceste ținte.

Când executăm comanda make, acesta caută fișierul make și îl scanează pentru a găsi ținta și a accesa dependențele acestuia. Dacă dependențele nu sunt specificate, va căuta dependența și o va construi. Acesta va construi ținta principală după ce dependențele sunt construite.

De exemplu, dacă vrem să schimbăm un singur fișier sursă și executăm comanda make; deci, aceasta va compila numai fișierul obiect care este conectat cu acel fișier sursă. Va economisi mult timp la compilarea finală a proiectului.

Ce este Makefile?

Comanda make invocă execuția fișierului make. Este un fișier special care conține comenzile shell pe care le creăm pentru a menține proiectul. Makefile conține ținte și comenzi pentru execuție. Nu este permisă crearea a mai mult de un makefile. Este recomandat să creați un director separat pentru acesta.

Ține evidența fișierelor recente, așa că actualizează doar acele fișiere necesare. Dacă avem un program mare cu multe fișiere sursă, trebuie să recompilăm toate fișierele dependente. Deci, poate fi un proces care necesită foarte mult timp.

Makefile are o listă de standarde. Aceste standarde sunt utile pentru ca sistemul să înțeleagă ce comandă vrem să executăm. Aceste standarde sunt în două părți și separate printr-o nouă linie. Prima linie este linia de dependență, iar rândurile ulterioare sunt considerate ca acțiuni sau comandă s. Comenzile sunt separate printr-o filă în noua linie.

The dependențe specificați relația fiecărui fișier cu fișierele sursă. Si ţintă este un fișier executabil și este creat după executarea comenzii make.

Opțiuni

Comanda make facilitează diverse opțiuni pentru a o face mai specifică. Câteva opțiuni importante sunt următoarele:

    -b, -m:Aceste opțiuni sunt folosite pentru a ignora compatibilitatea pentru diferitele versiuni ale comenzii make.-B, --intotdeauna-fa:Aceste opțiuni sunt folosite pentru a face necondiționat toate țintele.-C dir, --directory=dir:Aceste opțiuni sunt folosite pentru a schimba directorul înainte de a executa fișierul make.-d:Este folosit pentru a tipări informațiile de depanare.--debug[=FLAGS]:Este folosit pentru a tipări informațiile de depanare împreună cu procesarea normală. Dacă omitem steag, atunci acesta va afișa rezultate similare cu opțiunea „-d”.-e, --environment-overrides:Este folosit pentru a furniza variabilele preluate de la prioritatea mediului la makefile.-f fișier, --file=fișier, --makefile=FIȘIER:Este folosit pentru a folosi un fișier ca makefile.-i, --ignore-errors:Opțiunea „-i” este folosită pentru a ignora toate erorile din comenzi.-I dir, --include-dir=dir:Este folosit pentru a specifica un director pentru a căuta makefile-ul specificat. Dacă specificăm numeroasele opțiuni „-I”, va căuta în numeroasele directoare în ordinea specificată.-j [locuri de muncă], --locuri de muncă[=locuri de muncă]:Este folosit pentru a specifica numărul de joburi de rulat simultan. Dacă oferim multe opțiuni „-j”, ultima va fi considerată a fi executată. Dacă nu specificăm numărul de joburi, acesta nu va limita joburile care pot rula simultan.-k, --continuă:Este folosit pentru a continua programul cât mai mult posibil după ce apare o eroare.-l [încărcare], --încărcare-medie[=încărcare]:Este folosit pentru a specifica că nu trebuie pornită nicio sarcină nouă dacă alte sarcini sunt în coadă și media de încărcare este la minim.-n, --just-print, --dry-run, --recon:Este folosit pentru a afișa comanda care ar fi rulată.-o fișier, --old-file=fișier, --assume-old=fișier:Este folosit pentru a se asigura că make-ul nu va reface fișierul chiar dacă este mai vechi decât dependențele sale.-O[tip], --output-sync[=tip]:Este folosit pentru a confirma rezultatul fiecărei sarcini, mai degrabă decât un rezultat mixt al altor sarcini. Este util pentru procesarea mai multor lucrări cu opțiunea „-j”.-p, --print-data-base:Este folosit pentru a tipări baza de date care o produce după citirea fișierelor make. De asemenea, este util să tipăriți informațiile despre versiune atunci când sunt utilizate cu opțiunea „-v”. Pentru a imprima baza de date fără a încerca să refaceți niciun fișier, executați comanda după cum urmează:
    face -p -f/dev/null.-q, --intrebare:Opțiunea „-q” este utilizată pentru Modul întrebări. Nu va rula nicio comandă și nu va imprima nimic. Va returna o stare de ieșire zero doar dacă ținta specificată este deja sincronizată; în caz contrar, va afișa o stare de ieșire diferită de zero.-r, --no-builtin-rules:Este folosit pentru a elimina utilizarea regulilor implicite încorporate.-R, --fără-variabile-incorporate:Este util dacă nu dorim să definim nicio variabilă încorporată.-s, --tăcut, --liniștit:Aceste opțiuni sunt numite Funcționare silențioasă. Limitează tipărirea comenzilor pe măsură ce sunt executate.-S, --nu-continuă, --oprește-te:Este folosit pentru a anula efectul operațiunii „-k, --keep-going”.-t, --atinge:Este folosit pentru a atinge fișierele în loc să ruleze comenzile acestora.--urmă:Este folosit pentru a urmări dispoziția fiecărei ținte.-v, --versiunea:Este folosit pentru a tipări versiunea instalată a utilitarului make. În plus, afișează o listă de autori, drepturi de autor și unele notificări cu privire la utilitarul make.-w, --print-directory:Este folosit pentru a urmări un mesaj tipărit care conține un director de lucru înainte și după alte procesări. Este util să urmăriți erorile din structura complicată a comenzii recursive make.--no-print-directory:Este folosit pentru a dezactiva opțiunea „-w”.-W fișier, --what-if=fișier, --new-file=fișier, --assume-new=fișier:Aceste opțiuni pretind că fișierul țintă tocmai a fost modificat.--warn-undefined-variables:Această opțiune este utilizată pentru a avertiza că este referită o variabilă nedefinită.

Să înțelegem câteva exemple ale comenzii make. Vom vedea utilizarea de bază a makefile și, în continuare, vom crea câteva programe c++ și un makefile. Vom efectua câteva operații asupra lor pentru a înțelege mai bine comanda make.

cate orase este in Statele Unite

Utilizarea de bază a comenzii make

Să înțelegem utilizarea de bază a comenzii make și vă poate ajuta să înțelegeți cum funcționează.

Creați un director „proiect” și schimbați directorul în el. Luați în considerare comenzile de mai jos:

 mkdir project cd project 

Acum creați un „Makefile” având următorul conținut pentru primul program:

 say_hello: echo 'Hello World!' 

Din fișierul de mai sus, say_hello este o țintă care se comportă ca o funcție în orice limbaj de programare, iar echo va fi considerat ca o acțiune. Trebuie reținut că acțiunea ar trebui scrisă folosind a TAB. Ținta și acțiunea împreună creează o regulă pentru makefile. Acum, executați comanda make după cum urmează:

Luați în considerare rezultatul de mai jos:

Linux make command

Din rezultatul de mai sus, putem vedea că se afișează operația ecou în sine. Dacă nu dorim să afișăm comanda echo pe ieșire, executați ecou începând cu „@” simbol. Pentru a suprima ecoul, actualizați conținutul makefile după cum urmează:

 say_hello: @echo 'Hello World!' 

Luați în considerare rezultatul de mai jos:

Linux make command

O țintă poate fi un fișier binar care depinde de acțiuni.

caracter în șir în java

Să mai adăugăm câteva ținte, cum ar fi generarea și listarea în fișierul make. Actualizați makefile-ul după cum urmează:

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

Dacă executăm comanda make, aceasta execută doar prima țintă deoarece este ținta implicită a fișierului make. Luați în considerare rezultatul de mai jos:

Linux make command

Putem schimba ținta implicită incluzând conținutul de mai jos în fișierul nostru make:

 .DEFAULT_GOAL := generate 

Adăugați-l la prima linie a fișierului după cum urmează:

Linux make command

Makefile de mai sus va considera „generare” ca obiectiv implicit. Executați comanda make și va da rezultatul după cum urmează:

Linux make command

Opțiunea DEFAULT GOAL va executa o singură țintă pentru a specifica mai mult de o țintă pentru a utiliza toate opțiunile. Pentru a specifica mai mult de o țintă, actualizați prima linie a fișierului make după cum urmează:

 all: say_hello generate 

Acesta va executa ținta specificată. Luați în considerare rezultatul de mai jos:

Linux make command

Există o altă opțiune care ne permite să executăm toate țintele. Dacă vrem să executăm toate țintele makefile-ului, actualizați fișierul după cum urmează:

 .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 

Fișierul de mai sus va realiza toate țintele specificate. Executați comanda make, luați în considerare rezultatul de mai jos:

Linux make command

Utilizarea avansată a comenzii make

Să creăm un proiect C++ având fișierele main.cpp, function1.cpp, function2.cpp și un fișier de dependență function.h.

Codul fișierelor este următorul:

np punct

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

funcții.h:

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

Acum creați un fișier executabil al proiectului de mai sus executând comanda de mai jos:

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

Comanda de mai sus va crea un fișier executabil 'Buna ziua' a fișierelor main.cpp, function1.cpp și function2.cpp.

Luați în considerare rezultatul de mai jos:

Linux make command

Din rezultatul de mai sus, dacă este executat cu succes, nu va da nicio ieșire.

Să executăm aceeași sarcină utilizând fișierul make.

Creați un fișier ca Makefile și pune codul de mai jos în el.

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

Cuvântul cheie all este folosit pentru țintă și în newline puneți aceeași comandă cu un TAB ca mai sus pentru a specifica operația. Salvați fișierul. Luați în considerare fișierul de mai jos:

Linux make command

Pentru a opera, executați comanda după cum urmează:

anaconda vs șarpe piton
 make 

Comanda de mai sus va crea un fișier executabil „bună ziua” al fișierelor specificate. Luați în considerare rezultatul de mai jos:

Linux make command

Să mai adăugăm câteva sarcini la Makefile. Adăugați o sarcină 'compila' după cum urmează:

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

Pentru a executa sarcina compila, executați comanda de mai jos:

 make compile 

Comanda de mai sus va executa sarcina de compilare. Luați în considerare rezultatul de mai jos:

Linux make command

Să mai executăm câteva sarcini în fișierul nostru make.

actualizați Makefile după cum urmează:

 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 

Din makefile de mai sus, am creat trei obiecte ca main.o, function1.o și function2.o. În plus, am furnizat dependențele pentru ținte main.o, function1.o și function2.o ca main.cpp, function1.cpp și, respectiv, function2.cpp. Toate țintele vor îndeplini sarcinile specificate în cadrul acestuia. De asemenea, am specificat o țintă curată pentru a curăța toate dependențele și a elimina fișierul executabil.

Acum executați comanda make all pentru a executa noul nostru makefile.

 make all 

Luați în considerare rezultatul de mai jos:

Linux make command

Din rezultatul de mai sus, putem vedea că comanda a executat mai întâi main.o, function1.o și, respectiv, function2.o. Acesta va crea fișierul executabil și obiectele fișierelor date. Nu va executa ținta curată pentru că nu am specificat-o în Hello. Luați în considerare fișierele de mai jos:

Linux make command

Comanda make are un proces de lucru direct. A executat opțiunea all și a mers la salut. După executarea hello, a citit ținta în secvența specificată. A căutat fiecare țintă și dependența acesteia și le-a executat în secvență.

Pentru a elimina obiectele și fișierul executabil, efectuați sarcina de curățare. Pentru a efectua sarcina de curățare, executați comanda după cum urmează:

 make clean 

Luați în considerare rezultatul de mai jos:

Linux make command

Comanda de mai sus va elimina toate obiectele și fișierele executabile. Vedeți imaginea de mai jos a directorului:

Linux make command

Din imaginea de mai sus, putem vedea că ne-am curățat directorul.

Variabile în comanda make

Putem defini variabilele din makefile. Pentru a defini variabilele, utilizați '=' operator. De exemplu, dacă vrem să creăm o variabilă A și să îi atribuim o comandă gcc, atribuiți-o ca:

diferența dintre dragoste și placere
 A=g++ 

Utilizați-l după cum urmează în fișierul nostru make:

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

Este transmis la terminal ca:

 g++ hello.cpp -o hello 

Putem folosi $(A) în loc de ${A}, deoarece ambele sunt tratate la fel de către script.

Comentarii în makefile

Pentru a adăuga un comentariu în fișierul make, utilizați '#' simbol. De exemplu, pentru a adăuga un comentariu în secțiunea de compilare, adăugați-l ca '# Acesta va compila programul .' Comentariile sunt ignorate de compilator.