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:
face -p -f/dev/null.
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:
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:
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:
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ă:
Makefile de mai sus va considera „generare” ca obiectiv implicit. Executați comanda make și va da rezultatul după cum urmează:
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:
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:
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:
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:
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:
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:
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:
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:
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:
Comanda de mai sus va elimina toate obiectele și fișierele executabile. Vedeți imaginea de mai jos a directorului:
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.