logo

Comando make di Linux

Il Linux Fare Il comando viene utilizzato per creare e mantenere gruppi di programmi e file dal codice sorgente. In Linux è uno dei comandi più utilizzati dagli sviluppatori. Aiuta gli sviluppatori a installare e compilare molte utilità dal terminale. Inoltre, gestisce il processo di compilazione di progetti di grandi dimensioni. Risparmia il tempo di compilazione.

Lo scopo principale del comando make è suddividere in parti un programma di grandi dimensioni e verificare se necessita di essere ricompilato o meno. Inoltre, emette gli ordini necessari per ricompilarli.

In questa sezione utilizzeremo i programmi C++ poiché il linguaggio di programmazione C++ è un linguaggio orientato agli oggetti, ma puoi utilizzare qualsiasi linguaggio installato sul tuo computer. Non si limita solo ai programmi; possiamo usarlo anche per descrivere altri compiti.

Come funziona il comando make?

Il comando make accetta obiettivi come argomenti. Questi argomenti sono specificati in 'Makefile.' Il makefile contiene i target e le azioni associate relative a questi target.

Quando eseguiamo il comando make, cerca il makefile e lo scansiona per trovare la destinazione e accedere alle sue dipendenze. Se le dipendenze non vengono specificate, cercherà la dipendenza e la creerà. Costruirà l'obiettivo principale dopo la creazione delle dipendenze.

Ad esempio, se vogliamo modificare un solo file sorgente ed eseguiamo il comando make; quindi, questo compilerà solo il file oggetto connesso a quel file sorgente. Risparmierà molto tempo nella compilazione finale del progetto.

Cos'è Makefile?

Il comando make richiama l'esecuzione del makefile. È un file speciale che contiene i comandi shell che creiamo per mantenere il progetto. Il makefile contiene destinazioni e comandi per l'esecuzione. Non è consentito creare più di un makefile. Si consiglia di creare una directory separata per questo.

Tiene traccia dei file recenti, quindi aggiorna solo i file richiesti. Se abbiamo un programma di grandi dimensioni con molti file sorgente, dobbiamo ricompilare tutti i file dipendenti. Quindi, potrebbe essere un processo che richiede molto tempo.

Il makefile ha un elenco di standard. Questi standard sono utili al sistema per capire quale comando vogliamo eseguire. Questi standard sono divisi in due parti e separati da una nuova riga. La prima riga è la linea di dipendenza, e le righe successive sono considerate come azioni o comandi S. I comandi sono separati da un tab nella nuova riga.

IL dipendenze specificare la relazione di ciascun file con i file di origine. E il bersaglio è un file eseguibile e viene creato dopo l'esecuzione del comando make.

Opzioni

Il comando make facilita varie opzioni per renderlo più specifico. Alcune opzioni importanti sono le seguenti:

    -b, -m:Queste opzioni vengono utilizzate per ignorare la compatibilità per le diverse versioni del comando make.-B, --always-make:Queste opzioni vengono utilizzate per creare incondizionatamente tutti i bersagli.-C dir, --directory=dir:Queste opzioni vengono utilizzate per modificare la directory prima di eseguire il makefile.-D:Viene utilizzato per stampare le informazioni di debug.--debug[=FLAG]:Viene utilizzato per stampare le informazioni di debug insieme alla normale elaborazione. Se saltiamo il flag, mostrerà risultati simili all'opzione '-d'.-e, --environment-override:Viene utilizzato per fornire al makefile le variabili prese dalla precedenza dell'ambiente.-f file, --file=file, --makefile=FILE:Viene utilizzato per utilizzare un file come makefile.-i, --ignore-errori:L'opzione '-i' viene utilizzata per ignorare tutti gli errori nei comandi.-I dir, --include-dir=dir:Viene utilizzato per specificare una directory in cui cercare il makefile specificato. Se specifichiamo le numerose opzioni '-I', cercherà nelle numerose directory nell'ordine specificato.-j [lavori], --lavori[=lavori]:Viene utilizzato per specificare il numero di lavori da eseguire simultaneamente. Se forniamo molte opzioni '-j', verrà considerata eseguita l'ultima. Se non specifichiamo il numero di lavori, non limiterà i lavori che possono essere eseguiti contemporaneamente.-k, --continua:Viene utilizzato per continuare il programma il più possibile dopo aver ricevuto un errore.-l [carico], --load-average[=carico]:Viene utilizzato per specificare che nessuna nuova attività deve essere avviata se altre attività sono in coda e il carico medio è al minimo.-n, --just-print, --dry-run, --recon:Viene utilizzato per visualizzare il comando che verrà eseguito.-o file, --old-file=file, --assume-old=file:Viene utilizzato per garantire che make non rifarà il file anche se è più vecchio delle sue dipendenze.-O[tipo], --output-sync[=tipo]:Viene utilizzato per confermare che l'output di ciascuna attività sia messo insieme piuttosto che un output misto di altre attività. È utile per l'elaborazione di più lavori con l'opzione '-j'.-p, --print-database:Viene utilizzato per stampare il database prodotto dopo aver letto i makefile. È anche utile stampare le informazioni sulla versione quando utilizzato con l'opzione '-v'. Per stampare il database senza provare a rifare alcun file, eseguire il comando come segue:
    make -p -f/dev/null.-q, --domanda:L'opzione '-q' viene utilizzata per Modalità domanda. Non eseguirà alcun comando né stamperà nulla. Restituirà uno stato di uscita pari a zero solo se la destinazione specificata è già sincronizzata; in caso contrario, visualizzerà uno stato di uscita diverso da zero.-r, --no-regole-integrate:Viene utilizzato per eliminare l'uso delle regole implicite integrate.-R, --no-variabili-integrate:È utile se non vogliamo definire alcuna variabile incorporata.-s, --silent, --quiet:Queste opzioni vengono chiamate Funzionamento silenzioso. Si limita a stampare i comandi mentre vengono eseguiti.-S, --no-continua, --stop:Viene utilizzato per annullare l'effetto dell'operazione '-k, --keep-going'.-t, --touch:Viene utilizzato per toccare i file invece di eseguire i relativi comandi.--traccia:Viene utilizzato per tracciare la disposizione di ciascun bersaglio.-v, --versione:Viene utilizzato per stampare la versione installata dell'utilità make. Inoltre, visualizza un elenco di autori, copyright e alcuni avvisi relativi all'utilità make.-w, --print-directory:Viene utilizzato per tenere traccia di un messaggio di stampa che contiene una directory di lavoro prima e dopo altre elaborazioni. È utile rintracciare gli errori nella complicata struttura del comando make ricorsivo.--no-print-directory:Viene utilizzato per disattivare l'opzione '-w'.-W file, --what-if=file, --new-file=file, --assume-new=file:Queste opzioni fingono che il file di destinazione sia stato appena modificato.--warn-unfine-variables:Questa opzione viene utilizzata per avvisare che viene fatto riferimento a una variabile non definita.

Comprendiamo alcuni esempi del comando make. Vedremo l'uso di base del makefile e, inoltre, creeremo alcuni programmi C++ e un makefile. Effettueremo su di essi alcune operazioni per comprendere meglio il comando make.

registro insensato

Uso di base del comando make

Comprendiamo l'uso di base del comando make e potrebbe aiutarti a capire come funziona.

Crea una directory 'progetto' e cambia la directory in essa. Considera i comandi seguenti:

 mkdir project cd project 

Ora crea un 'Makefile' avente il seguente contenuto per il primo programma:

 say_hello: echo 'Hello World!' 

Dal file precedente, say_hello è un target che si comporta come una funzione in qualsiasi linguaggio di programmazione ed echo verrà considerata come un'azione. È necessario ricordare che l'azione deve essere scritta utilizzando a TAB. La destinazione e l'azione insieme creano una regola per il makefile. Ora esegui il comando make come segue:

Considera l'output seguente:

Comando make di Linux

Dall'output precedente, possiamo vedere l'operazione di eco stessa visualizzata. Se non vogliamo visualizzare il comando echo sull'output, eseguiamo echo iniziando da '@' simbolo. Per sopprimere l'eco, aggiornare il contenuto del makefile come segue:

 say_hello: @echo 'Hello World!' 

Considera l'output seguente:

Comando make di Linux

Una destinazione potrebbe essere un file binario che dipende dalle azioni.

Aggiungiamo qualche altro target, come generate e list nel makefile. Aggiorna il makefile come segue:

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

Se eseguiamo il comando make, verrà eseguito solo il primo target perché è il target predefinito del makefile. Considera l'output seguente:

Comando make di Linux

Possiamo modificare la destinazione predefinita includendo il contenuto seguente nel nostro makefile:

 .DEFAULT_GOAL := generate 

Aggiungilo alla prima riga del file come segue:

Comando make di Linux

Il makefile sopra considererà 'generare' come obiettivo predefinito. Esegui il comando make e fornirà l'output come segue:

Comando make di Linux

L'opzione DEFAULT GOAL eseguirà solo un target per specificare più di un target per utilizzare tutte le opzioni. Per specificare più di una destinazione, aggiornare la prima riga del makefile come segue:

 all: say_hello generate 

Eseguirà il target specificato. Considera l'output seguente:

Comando make di Linux

C'è un'altra opzione che ci consente di eseguire tutti gli obiettivi. Se vogliamo eseguire tutte le destinazioni del makefile, aggiorniamo il file come segue:

 .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 

Il file sopra eseguirà tutti gli obiettivi specificati. Esegui il comando make, considera l'output seguente:

Comando make di Linux

Uso avanzato del comando make

Creiamo un progetto C++ con i file main.cpp, function1.cpp, function2.cpp e un file di dipendenza function.h.

Il codice dei file è il seguente:

l'età di sara ali khan

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

funzione1.cpp:

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

funzione2.cpp:

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

funzioni.h:

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

Ora crea un file eseguibile del progetto sopra eseguendo il comando seguente:

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

Il comando precedente creerà un file eseguibile 'Ciao' dei file main.cpp, function1.cpp e function2.cpp.

Considera l'output seguente:

Comando make di Linux

Dall'output precedente, se eseguito con successo, non verrà restituito alcun output.

Eseguiamo la stessa attività utilizzando il makefile.

Crea un file come Makefile e inserisci il codice seguente.

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

La parola chiave all viene utilizzata per target e in newline inserire lo stesso comando con un TAB come sopra per specificare l'operazione. Salvare il file. Considera il file seguente:

Comando make di Linux

Per operare, eseguire il comando come segue:

commento PowerShell su più righe
 make 

Il comando precedente creerà un file eseguibile 'ciao' dei file specificati. Considera l'output seguente:

Comando make di Linux

Aggiungiamo alcune altre attività a Makefile. Aggiungi un'attività 'compilare' come segue:

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

Per eseguire l'attività compilare, eseguire il comando seguente:

 make compile 

Il comando precedente eseguirà l'attività di compilazione. Considera l'output seguente:

Comando make di Linux

Eseguiamo alcune altre attività sul nostro makefile.

aggiorna il Makefile come segue:

 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 

Dal makefile precedente, abbiamo creato tre oggetti come main.o, function1.o e function2.o. Inoltre, abbiamo fornito le dipendenze per gli obiettivi main.o, function1.o e function2.o rispettivamente come main.cpp, function1.cpp e function2.cpp. Tutti i target eseguiranno le attività specificate al suo interno. Abbiamo anche specificato un obiettivo pulito per pulire tutte le dipendenze e rimuovere il file eseguibile.

Ora esegui il comando make all per eseguire il nostro nuovo makefile.

 make all 

Considera l'output seguente:

Comando make di Linux

Dall'output sopra, possiamo vedere che il comando ha prima eseguito rispettivamente main.o, function1.o e function2.o. Creerà il file eseguibile e gli oggetti dei file specificati. Non eseguirà il target pulito perché non lo abbiamo specificato in hello. Considera i file seguenti:

Comando make di Linux

Il comando make ha un processo di lavoro semplice. Ha eseguito l'opzione all ed è andato a ciao. Dopo l'esecuzione di hello, legge il target nella sequenza specificata. Ha cercato ogni destinazione e la sua dipendenza e li ha eseguiti in sequenza.

Per rimuovere gli oggetti e il file eseguibile, eseguire l'attività di pulizia. Per eseguire l'attività di pulizia, eseguire il comando come segue:

 make clean 

Considera l'output seguente:

Comando make di Linux

Il comando precedente rimuoverà tutti gli oggetti e i file eseguibili. Vedi lo snap qui sotto della directory:

Comando make di Linux

Dall'immagine sopra, possiamo vedere che abbiamo ripulito la nostra directory.

Variabili nel comando make

Possiamo definire le variabili nel nostro makefile. Per definire le variabili, utilizzare il file '=' operatore. Ad esempio, se vogliamo creare una variabile A e assegnarle un comando gcc, assegnatelo come:

differenza tra amore e simpatia
 A=g++ 

Usalo come segue nel nostro makefile:

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

Viene passato al terminale come:

 g++ hello.cpp -o hello 

Possiamo usare $(A) invece di ${A}, poiché entrambi vengono trattati allo stesso modo dallo script.

Commenti nel makefile

Per aggiungere un commento nel makefile, utilizzare il file '#' simbolo. Ad esempio, per aggiungere un commento nella sezione di compilazione, aggiungilo come '# Questo compilerà il programma .' I commenti vengono ignorati dal compilatore.