logo

Linux make command

El Linux fer L'ordre s'utilitza per crear i mantenir grups de programes i fitxers a partir del codi font. A Linux, és una de les ordres més utilitzades pels desenvolupadors. Ajuda als desenvolupadors a instal·lar i compilar moltes utilitats des del terminal. A més, gestiona el procés de compilació dels grans projectes. Estalvia el temps de compilació.

El motiu principal de l'ordre make és determinar un programa gran en parts i comprovar si cal recompilar-lo o no. A més, emet les ordres necessàries per recompilar-les.

En aquesta secció, utilitzarem programes C++ ja que el llenguatge de programació C++ és un llenguatge orientat a objectes, però podeu utilitzar qualsevol llenguatge instal·lat a la vostra màquina. No es limita només als programes; el podem utilitzar per descriure altres tasques també.

Com funciona l'ordre Make?

L'ordre make pren els objectius com a arguments. Aquests arguments s'especifiquen a 'Makefile'. El makefile conté els objectius i les accions associades relacionades amb aquests objectius.

Quan executem l'ordre make, cerca el makefile i l'escaneja per trobar l'objectiu i accedir a les seves dependències. Si no s'especifiquen dependències, buscarà la dependència i la construirà. Construirà l'objectiu principal després de crear les dependències.

Per exemple, si volem canviar només un fitxer font i executem l'ordre make; per tant, això compilarà només el fitxer objecte connectat amb aquest fitxer font. S'estalviarà molt de temps en la compilació final del projecte.

Què és Makefile?

L'ordre make invoca l'execució del fitxer make. És un fitxer especial que conté les ordres de shell que creem per mantenir el projecte. El makefile conté objectius i ordres per a l'execució. No està permès crear més d'un fitxer makefile. Es recomana crear un directori separat per a això.

Fa un seguiment dels fitxers recents, de manera que només actualitza els fitxers necessaris. Si tenim un programa gran amb molts fitxers font, hem de recompilar tots els fitxers dependents. Per tant, pot ser un procés molt llarg.

El makefile té una llista d'estàndards. Aquests estàndards són útils perquè el sistema entengui quina ordre volem executar. Aquests estàndards estan en dues parts i separats per una nova línia. La primera línia és la línia de dependència, i les línies posteriors es consideren com a accions o comandament s. Les ordres es separen amb una pestanya a la nova línia.

El dependències especificar la relació de cada fitxer amb els fitxers font. I la objectiu és un fitxer executable i es crea després de l'execució de l'ordre make.

Opcions

L'ordre make facilita diverses opcions per fer-ho més específic. Algunes opcions importants són les següents:

    -b, -m:Aquestes opcions s'utilitzen per ignorar la compatibilitat de les diferents versions de l'ordre make.-B, --sempre-feu:Aquestes opcions s'utilitzen per fer tots els objectius incondicionalment.-C dir, --directory=dir:Aquestes opcions s'utilitzen per canviar el directori abans d'executar el makefile.-d:S'utilitza per imprimir la informació de depuració.--debug[=BANDERES]:S'utilitza per imprimir la informació de depuració juntament amb el processament normal. Si saltem la bandera, mostrarà resultats similars a l'opció '-d'.-e, --environment-overrides:S'utilitza per proporcionar les variables preses de la precedència de l'entorn a makefile.-f fitxer, --file=fitxer, --makefile=fitxer:S'utilitza per utilitzar un fitxer com a fitxer de creació.-i, --ignore-errors:L'opció '-i' s'utilitza per ignorar tots els errors de les ordres.-I dir, --include-dir=dir:S'utilitza per especificar un directori per cercar el makefile especificat. Si especifiquem les moltes opcions '-I', buscarà als molts directoris en l'ordre especificat.-j [ocupacions], --ocupacions[=ocupacions]:S'utilitza per especificar el nombre de treballs a executar simultàniament. Si proporcionem moltes opcions '-j', es considerarà que s'executa l'última. Si no especifiquem el nombre de treballs, no limitarà els treballs que es poden executar simultàniament.-k, --segueix:S'utilitza per continuar el programa tant com sigui possible després d'obtenir un error.-l [càrrega], --load-average[=càrrega]:S'utilitza per especificar que no s'ha d'iniciar cap tasca nova si hi ha altres tasques a la cua i la mitjana de càrrega és mínima.-n, --just-print, --dry-run, --recon:S'utilitza per mostrar l'ordre que s'executaria.-o fitxer, --old-file=fitxer, --assume-old=fitxer:S'utilitza per assegurar que el make no refermarà el fitxer encara que sigui més antic que les seves dependències.-O[tipus], --output-sync[=tipus]:S'utilitza per confirmar que la sortida de cada tasca s'ha reunit en lloc d'una sortida mixta d'altres tasques. És útil per al processament de treballs múltiples amb l'opció '-j'.-p, --print-data-base:S'utilitza per imprimir la base de dades que es produeix després de llegir els makefiles. També és útil imprimir la informació de la versió quan s'utilitza amb l'opció '-v'. Per imprimir la base de dades sense intentar refer cap fitxer, executeu l'ordre de la següent manera:
    fer -p -f/dev/null.-q, --pregunta:L'opció '-q' s'utilitza per a Mode de pregunta. No executarà cap comanda ni imprimirà res. Només retornarà un estat de sortida zero si l'objectiu especificat ja està sincronitzat; en cas contrari, mostrarà un estat de sortida diferent de zero.-r, --no-builtin-rules:S'utilitza per eliminar l'ús de les regles implícites incorporades.-R, --no-variables-incorporades:És útil si no volem definir cap variable integrada.-s, --silenciós, --quiet:Aquestes opcions s'anomenen Funcionament silenciós. Restringeix la impressió de les ordres a mesura que s'executen.-S, --no-seguim, --stop:S'utilitza per cancel·lar l'efecte de l'operació '-k, --keep-going'.-t, --toqueu:S'utilitza per tocar fitxers en lloc d'executar les seves ordres.--traça:S'utilitza per rastrejar la disposició de cada objectiu.-v, --versió:S'utilitza per imprimir la versió instal·lada de la utilitat make. A més, mostra una llista d'autors, drets d'autor i algun avís sobre la utilitat make.-w, --print-directory:S'utilitza per fer un seguiment d'un missatge d'impressió que conté un directori de treball abans i després d'un altre processament. És útil rastrejar errors de la complicada estructura de l'ordre recursiva make.--no-print-directory:S'utilitza per desactivar l'opció '-w'.-W fitxer, --what-if=fitxer, --new-file=fitxer, --assume-new=fitxer:Aquestes opcions pretenen que el fitxer de destinació s'acaba de modificar.--warn-undefined-variables:Aquesta opció s'utilitza per advertir que es fa referència a una variable no definida.

Entendrem alguns exemples de l'ordre make. Veurem l'ús bàsic de makefile i, a més, crearem alguns programes en C++ i un makefile. Farem algunes operacions sobre ells per entendre millor l'ordre make.

mida de python

Ús bàsic de l'ordre make

Entenem l'ús molt bàsic de l'ordre make, i us pot ajudar a entendre com funciona.

javafx

Creeu un directori 'projecte' i canvieu-hi el directori. Tingueu en compte les ordres següents:

 mkdir project cd project 

Ara crea un 'Makefile' amb el contingut següent per al primer programa:

 say_hello: echo 'Hello World!' 

A partir del fitxer anterior, say_hello és un objectiu que es comporta com una funció en qualsevol llenguatge de programació, i l'eco es considerarà com una acció. Cal recordar que l'acció s'ha d'escriure utilitzant a TAB. L'objectiu i l'acció junts creen una regla per al fitxer makefile. Ara, executeu l'ordre make de la següent manera:

Considereu la sortida següent:

Linux make command

A partir de la sortida anterior, podem veure que es mostra l'operació d'eco en si. Si no volem mostrar l'ordre echo a la sortida, executeu l'eco començant per '@' símbol. Per suprimir l'eco, actualitzeu el contingut de makefile de la següent manera:

 say_hello: @echo 'Hello World!' 

Considereu la sortida següent:

Linux make command

Un objectiu pot ser un fitxer binari que depèn de les accions.

Afegim uns quants objectius més, com ara generar i llistar al fitxer makefile. Actualitzeu el fitxer makefile de la següent manera:

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

Si executem l'ordre make, només executa el primer objectiu perquè és l'objectiu predeterminat del makefile. Considereu la sortida següent:

Linux make command

Podem canviar l'objectiu predeterminat incloent el contingut següent al nostre makefile:

 .DEFAULT_GOAL := generate 

Afegiu-lo a la primera línia del fitxer de la següent manera:

Linux make command

El makefile anterior considerarà 'generar' com a objectiu predeterminat. Executeu l'ordre make i donarà la sortida de la següent manera:

Linux make command

L'opció OBJECTIU PREDETERMINAT només executarà un objectiu per especificar més d'un objectiu per utilitzar totes les opcions. Per especificar més d'un objectiu, actualitzeu la primera línia del fitxer makefile de la manera següent:

 all: say_hello generate 

Executarà l'objectiu especificat. Considereu la sortida següent:

Linux make command

Hi ha una altra opció que ens permet executar tots els objectius. Si volem executar tots els objectius del makefile, actualitzeu el fitxer de la següent manera:

 .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 

El fitxer anterior realitzarà tots els objectius especificats. Executeu l'ordre make, tingueu en compte la sortida següent:

Linux make command

Ús avançat de l'ordre make

Creem un projecte C++ amb fitxers main.cpp, function1.cpp, function2.cpp i un fitxer de dependència function.h.

El codi dels fitxers és el següent:

L'actriu Rakul Preet Singh

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

funcions.h:

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

Ara creeu un fitxer executable del projecte anterior executant l'ordre següent:

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

L'ordre anterior crearà un fitxer executable 'Hola' dels fitxers main.cpp, function1.cpp i function2.cpp.

Considereu la sortida següent:

Linux make command

A partir de la sortida anterior, si s'executa amb èxit, no donarà cap sortida.

Realitzem la mateixa tasca utilitzant el makefile.

Creeu un fitxer com Makefile i poseu-hi el codi següent.

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

La paraula clau all s'utilitza per a l'objectiu i, a la nova línia, poseu la mateixa ordre amb una TAB que l'anterior per especificar l'operació. Desa el fitxer. Considereu el fitxer següent:

Linux make command

Per operar, executeu l'ordre de la següent manera:

clau única mysql
 make 

L'ordre anterior crearà un fitxer executable 'hola' dels fitxers especificats. Considereu la sortida següent:

Linux make command

Afegim algunes tasques més a Makefile. Afegeix una tasca 'compilar' com segueix:

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

Per executar la tasca compilar, executeu l'ordre següent:

 make compile 

L'ordre anterior executarà la tasca de compilació. Considereu la sortida següent:

Linux make command

Anem a realitzar algunes tasques més al nostre makefile.

actualitzeu el Makefile de la següent manera:

 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 

A partir del makefile anterior, hem creat tres objectes com a main.o, function1.o i function2.o. A més, hem proporcionat les dependències per als objectius main.o, function1.o i function2.o com a main.cpp, function1.cpp i function2.cpp respectivament. Tots els objectius realitzaran les tasques especificades dins d'ell. També hem especificat un objectiu net per netejar totes les dependències i eliminar el fitxer executable.

Ara executeu l'ordre make all per executar el nostre nou makefile.

 make all 

Considereu la sortida següent:

Linux make command

A partir de la sortida anterior, podem veure que l'ordre va executar primer main.o, function1.o i function2.o respectivament. Crearà el fitxer executable i d'objectes dels fitxers donats. No executarà l'objectiu net perquè no l'hem especificat a hello. Considereu els fitxers següents:

Linux make command

L'ordre make té un procés de treball senzill. Va executar l'opció All i va anar a hola. Després de l'execució de Hello, va llegir l'objectiu en la seqüència especificada. Va cercar tots els objectius i la seva dependència i els va executar en la seqüència.

Per eliminar els objectes i el fitxer executable, realitzeu la tasca de neteja. Per realitzar la tasca de neteja, executeu l'ordre de la següent manera:

 make clean 

Considereu la sortida següent:

Linux make command

L'ordre anterior eliminarà tots els objectes i fitxers executables. Vegeu el següent snap del directori:

Linux make command

A la imatge de dalt, podem veure que hem netejat el nostre directori.

Variables a l'ordre make

Podem definir les variables al nostre makefile. Per definir les variables, utilitzeu '=' operador. Per exemple, si volem crear una variable A i assignar-li una ordre gcc, assigneu-la com:

símbol de derivada parcial làtex
 A=g++ 

Utilitzeu-lo de la següent manera al nostre makefile:

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

Es passa al terminal com:

 g++ hello.cpp -o hello 

Podem utilitzar $(A) en comptes de ${A}, ja que ambdós són tractats de la mateixa manera per l'script.

Comentaris al makefile

Per afegir un comentari al fitxer makefile, utilitzeu '#' símbol. Per exemple, per afegir un comentari a la secció de compilació, afegiu-lo com a '# Això compilarà el programa .' Els comentaris són ignorats pel compilador.