logo

Linux gör kommando

Linux göra kommandot används för att bygga och underhålla grupper av program och filer från källkoden. I Linux är det ett av de mest använda kommandona av utvecklarna. Det hjälper utvecklare att installera och kompilera många verktyg från terminalen. Vidare hanterar den sammanställningsprocessen för de stora projekten. Det sparar kompileringstiden.

Huvudmotivet för make-kommandot är att bestämma ett stort program i delar och kontrollera om det behöver kompileras om eller inte. Dessutom utfärdar den nödvändiga order för att kompilera dem igen.

I det här avsnittet kommer vi att använda C++-program eftersom programmeringsspråket C++ är ett objektorienterat språk, men du kan använda vilket språk som helst som är installerat på din maskin. Det är inte bara begränsat till program; vi kan använda den för att beskriva andra uppgifter också.

Hur fungerar make-kommandot?

Kommandot make tar mål som argument. Dessa argument är specificerade i 'Makefile'. Makefilen innehåller målen samt associerade åtgärder relaterade till dessa mål.

När vi kör kommandot make söker den efter makefilen och skannar den för att hitta målet och komma åt dess beroenden. Om beroenden inte anges kommer den att söka efter beroendet och bygga upp det. Det kommer att bygga huvudmålet efter att beroenden har byggts.

Till exempel, om vi bara vill ändra en källfil och vi kör kommandot make; så detta kompilerar endast objektfilen som är kopplad till den källfilen. Det kommer att spara mycket tid i den slutliga sammanställningen av projektet.

Vad är Makefile?

Make-kommandot anropar exekveringen av makefilen. Det är en speciell fil som innehåller skalkommandon som vi skapar för att underhålla projektet. Makefilen innehåller mål och kommandon för exekvering. Det är inte tillåtet att skapa mer än en makefile. Det rekommenderas att skapa en separat katalog för den.

Den håller reda på de senaste filerna, så uppdatera bara de filer som krävs. Om vi ​​har ett stort program med många källfiler måste vi kompilera om alla beroende filer. Så det kan vara en extremt tidskrävande process.

Makefilen har en lista med standarder. Dessa standarder är användbara för att systemet ska förstå vilket kommando vi vill utföra. Dessa standarder är i två delar och åtskilda av en ny linje. Den första raden är beroendelinjen, och de efterföljande raderna betraktas som handlingar eller kommando s. Kommandona separeras med en flik på den nya raden.

De beroenden specificera relationen mellan varje fil och källfilerna. Och den mål är en körbar fil, och den skapas efter körningen av kommandot make.

alternativ

Kommandot make underlättar olika alternativ för att göra det mer specifikt. Några viktiga alternativ är följande:

    -b, -m:Dessa alternativ används för att ignorera kompatibiliteten för de olika versionerna av kommandot make.-B, --alltid-gör:Dessa alternativ används för att villkorslöst göra alla mål.-C dir, --katalog=katalog:Dessa alternativ används för att ändra katalogen innan makefilen körs.-d:Den används för att skriva ut felsökningsinformationen.--debug[=FLAGGAR]:Den används för att skriva ut felsökningsinformationen tillsammans med normal bearbetning. Om vi ​​hoppar över flaggan kommer den att visa liknande resultat som alternativet '-d'.-e, --environment-overrides:Den används för att tillhandahålla variablerna från miljöns prioritet till makefile.-f fil, --file=fil, --makefile=FIL:Den används för att använda en fil som en makefil.-i, --ignore-errors:Alternativet '-i' används för att ignorera alla fel i kommandon.-I dir, --include-dir=dir:Den används för att ange en katalog för att söka efter den angivna makefilen. Om vi ​​anger de många '-I'-alternativen, kommer den att söka i de många katalogerna i den ordning som anges.-j [jobb], --jobb[=jobb]:Den används för att ange antalet jobb som ska köras samtidigt. Om vi ​​tillhandahåller många '-j'-alternativ, kommer den sista att anses exekveras. Om vi ​​inte anger antalet jobb kommer det inte att begränsa antalet jobb som kan köras samtidigt.-k, --fortsätt:Den används för att fortsätta programmet så mycket som möjligt efter att ha fått ett fel.-l [load], --load-genomsnitt[=load]:Den används för att specificera att ingen ny uppgift ska startas om andra uppgifter finns i kön och belastningsgenomsnittet är på sitt minimum.-n, --just-print, --dry-run, --recon:Den används för att visa kommandot som skulle köras.-o fil, --old-file=fil, --assume-old=fil:Den används för att säkerställa att fabrikatet inte kommer att göra om filen även om den är äldre än dess beroenden.-O[typ], --output-sync[=typ]:Den används för att bekräfta att resultatet av varje uppgift sätts ihop snarare än en blandad utdata av andra uppgifter. Det är användbart för bearbetning av flera jobb med alternativet '-j'.-p, --print-databas:Den används för att skriva ut databasen som produceras efter att ha läst make-filerna. Det är också användbart att skriva ut versionsinformationen när den används med alternativet '-v'. För att skriva ut databasen utan att försöka göra om några filer, kör kommandot enligt följande:
    gör -p -f/dev/null.-q, --fråga:Alternativet '-q' används för Frågeläge. Det kommer inte att köra något kommando eller skriva ut något. Det kommer bara att returnera en utgångsstatus är noll om det angivna målet redan är synkroniserat; annars kommer den att visa en utgångsstatus som inte är noll.-r, --no-builtin-regler:Det används för att eliminera användningen av de inbyggda implicita reglerna.-R, --no-builtin-variables:Det är användbart om vi inte vill definiera någon inbyggd variabel.-s, --tyst, --tyst:Dessa alternativ kallas Tyst drift. Det begränsar möjligheten att skriva ut kommandona när de exekveras.-S, --ingen-fortsätt-gå, --stopp:Den används för att avbryta effekten av '-k, --keep-going' operation.-t, --touch:Den används för att röra filer istället för att köra deras kommandon.--spår:Den används för att spåra placeringen av varje mål.-v, --version:Den används för att skriva ut den installerade versionen av make-verktyget. Vidare visar den en lista över författare, upphovsrätt och några meddelanden om fabrikatverktyget.-w, --print-katalog:Den används för att spåra ett utskriftsmeddelande som innehåller en arbetskatalog före och efter annan bearbetning. Det är användbart att spåra fel från den komplicerade strukturen av rekursiva make-kommandon.--no-print-directory:Den används för att stänga av alternativet '-w'.-W-fil, --what-if=fil, --new-file=fil, --assume-new=fil:Dessa alternativ låtsas att målfilen just har modifierats.--warn-undefined-variables:Detta alternativ används för att varna att en odefinierad variabel refereras.

Låt oss förstå några exempel på kommandot make. Vi kommer att se den grundläggande användningen av makefile, och vidare kommer vi att skapa några c++-program och en makefil. Vi kommer att utföra några operationer på dem för att bättre förstå make-kommandot.

rad vs kolumn

Grundläggande användning av make-kommandot

Låt oss förstå den mycket grundläggande användningen av kommandot make, och det kan hjälpa dig att förstå hur det fungerar.

Skapa ett katalog 'projekt' och byt katalog till det. Tänk på följande kommandon:

 mkdir project cd project 

Skapa nu en 'Makefile' med följande innehåll för det första programmet:

 say_hello: echo 'Hello World!' 

Från filen ovan är say_hello ett mål som beter sig som en funktion i vilket programmeringsspråk som helst, och eko kommer att betraktas som en åtgärd. Man måste komma ihåg att handling bör skrivas med hjälp av en FLIK. Målet och åtgärden skapar tillsammans en regel för makefilen. Utför nu kommandot make enligt följande:

Tänk på följande utdata:

Linux gör kommando

Från ovanstående utdata kan vi se att ekooperationen i sig visas. Om vi ​​inte vill visa ekokommandot på utgången, kör ekot som börjar med '@' symbol. För att undertrycka ekot, uppdatera innehållet i makefilen enligt följande:

 say_hello: @echo 'Hello World!' 

Tänk på följande utdata:

java räknare
Linux gör kommando

Ett mål kan vara en binär fil som beror på åtgärderna.

Låt oss lägga till några fler mål, som generera och lista i makefilen. Uppdatera makefilen enligt följande:

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

Om vi ​​kör kommandot make, kör det bara det första målet eftersom det är standardmålet för makefilen. Tänk på följande utdata:

Linux gör kommando

Vi kan ändra standardmålet genom att inkludera nedanstående innehåll i vår makefil:

 .DEFAULT_GOAL := generate 

Lägg till den på den första raden i filen enligt följande:

Linux gör kommando

Ovanstående makefil kommer att betrakta 'generera' som standardmålet. Utför make-kommandot, och det kommer att ge utdata enligt följande:

Linux gör kommando

Alternativet STANDARDMÅL kör endast ett mål för att ange mer än ett mål för att använda alla alternativ. För att ange mer än ett mål, uppdatera den första raden i makefilen enligt följande:

 all: say_hello generate 

Det kommer att utföra det angivna målet. Tänk på följande utdata:

Linux gör kommando

Det finns ett annat alternativ som gör att vi kan utföra alla mål. Om vi ​​vill köra alla mål för makefilen, uppdatera filen enligt följande:

 .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 

Ovanstående fil kommer att utföra alla angivna mål. Utför make-kommandot, överväg följande utdata:

Linux gör kommando

Avancerad användning av make-kommandot

Låt oss skapa ett C++-projekt med filerna main.cpp, function1.cpp, function2.cpp och en beroendefil function.h.

Koden för filerna är följande:

zip-kommando i linux

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

functions.h:

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

Skapa nu en körbar fil av ovanstående projekt genom att utföra kommandot nedan:

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

Ovanstående kommando kommer att skapa en körbar fil 'Hallå' av filerna main.cpp, function1.cpp och function2.cpp.

Tänk på följande utdata:

Linux gör kommando

Från ovanstående utdata, om den exekveras framgångsrikt, kommer den inte att ge någon utdata.

Låt oss utföra samma uppgift genom att använda makefilen.

Skapa en fil som Makefile och lägg koden nedan i den.

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

Nyckelordet all används för target och i newline läggs samma kommando med en TAB som ovan för att specificera operationen. Spara filen. Tänk på filen nedan:

Linux gör kommando

För att använda, utför kommandot enligt följande:

mysql ändra kolumntyp
 make 

Ovanstående kommando kommer att skapa en körbar fil 'hej' av de angivna filerna. Tänk på följande utdata:

Linux gör kommando

Låt oss lägga till några fler uppgifter till Makefile. Lägg till en uppgift 'sammanställa' som följer:

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

För att utföra uppgiften sammanställa, kör följande kommando:

 make compile 

Ovanstående kommando kommer att utföra kompileringsuppgiften. Tänk på följande utdata:

Linux gör kommando

Låt oss utföra några fler uppgifter till vår makefile.

uppdatera Makefilen enligt följande:

 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 

Från makefilen ovan har vi skapat tre objekt som main.o, function1.o och function2.o. Vidare har vi tillhandahållit beroenden för målen main.o, function1.o och function2.o som main.cpp, function1.cpp respektive function2.cpp. Alla mål kommer att utföra de specificerade uppgifterna inom den. Vi har också specificerat ett rent mål för att rensa alla beroenden och ta bort den körbara filen.

Kör nu kommandot make all för att köra vår nya makefil.

 make all 

Tänk på följande utdata:

Linux gör kommando

Från ovanstående utdata kan vi se att kommandot först körde main.o, function1.o respektive function2.o. Det kommer att skapa den körbara filen och objektfilen för de givna filerna. Det kommer inte att köra det rena målet eftersom vi inte har specificerat det i hej. Tänk på nedanstående filer:

Linux gör kommando

Make-kommandot har en enkel arbetsprocess. Den körde alternativet allt och gick till hej. Efter utförandet av hej läste den målet i den angivna sekvensen. Den sökte igenom varje mål och dess beroende och exekverade dem i sekvensen.

För att ta bort objekten och den körbara filen, utför rensningsuppgiften. För att utföra rensningsuppgiften, kör kommandot enligt följande:

 make clean 

Tänk på följande utdata:

Linux gör kommando

Ovanstående kommando tar bort alla objekt och körbara filer. Se bilden nedan av katalogen:

Linux gör kommando

Från bilden ovan kan vi se att vi har rensat vår katalog.

Variabler i make-kommandot

Vi kan definiera variablerna i vår makefile. För att definiera variablerna, använd '=' operatör. Till exempel, om vi vill skapa en variabel A och tilldela ett kommando gcc till den, tilldela den som:

osi referensmodell i nätverk
 A=g++ 

Använd den enligt följande i vår makefile:

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

Den skickas till terminalen som:

 g++ hello.cpp -o hello 

Vi kan använda $(A) istället för ${A}, eftersom båda behandlas på samma sätt av skriptet.

Kommentarer i makefile

För att lägga till en kommentar i makefilen, använd '#' symbol. Till exempel, för att lägga till en kommentar i kompileringssektionen, lägg till den som '# Detta kommer att kompilera programmet .' Kommentarer ignoreras av kompilatorn.