logo

Linux maakt opdracht

De Linux-versie maken commando wordt gebruikt om groepen programma's en bestanden vanuit de broncode te bouwen en te onderhouden. In Linux is het een van de meest gebruikte opdrachten door de ontwikkelaars. Het helpt ontwikkelaars bij het installeren en compileren van veel hulpprogramma's vanaf de terminal. Verder verzorgt het het compilatieproces van de omvangrijke projecten. Het bespaart compilatietijd.

Het hoofdmotief van het make-commando is om een ​​groot programma in delen te verdelen en te controleren of het opnieuw gecompileerd moet worden of niet. Ook geeft het de nodige opdrachten om ze opnieuw samen te stellen.

In deze sectie zullen we C++-programma's gebruiken, omdat de programmeertaal C++ een objectgeoriënteerde taal is, maar u kunt elke taal gebruiken die op uw computer is geïnstalleerd. Het is niet alleen beperkt tot programma's; we kunnen het ook gebruiken om andere taken te beschrijven.

Hoe werkt opdracht maken?

Het make-commando neemt doelen als argumenten. Deze argumenten worden gespecificeerd in 'Makefile.' Het makefile bevat de doelen en de bijbehorende acties die verband houden met deze doelen.

Wanneer we het make-commando uitvoeren, zoekt het naar het make-bestand en scant het om het doel te vinden en toegang te krijgen tot de afhankelijkheden ervan. Als er geen afhankelijkheden zijn opgegeven, wordt naar de afhankelijkheid gezocht en gebouwd. Het zal het hoofddoel bouwen nadat de afhankelijkheden zijn gebouwd.

Als we bijvoorbeeld slechts één bronbestand willen wijzigen en we de opdracht make uitvoeren; Dit zal dus alleen het objectbestand compileren dat is verbonden met dat bronbestand. Het bespaart veel tijd bij de uiteindelijke compilatie van het project.

Wat is Makefile?

Het make-commando roept de uitvoering van het makefile op. Het is een speciaal bestand dat de shell-opdrachten bevat die we maken om het project te onderhouden. Het makefile bevat doelen en opdrachten voor uitvoering. Het is niet toegestaan ​​om meer dan één makefile aan te maken. Het wordt aanbevolen om er een aparte map voor te maken.

Het houdt recente bestanden bij, dus werk alleen de bestanden bij die nodig zijn. Als we een groot programma hebben met veel bronbestanden, moeten we alle afhankelijke bestanden opnieuw compileren. Het kan dus een extreem tijdrovend proces zijn.

Het makefile bevat een lijst met standaarden. Deze standaarden zijn nuttig voor het systeem om te begrijpen welke opdracht we willen uitvoeren. Deze normen bestaan ​​uit twee delen en worden gescheiden door een nieuwe regel. De eerste regel is de afhankelijkheidslijn, en de daaropvolgende regels worden beschouwd als acties of commando's S. De opdrachten worden gescheiden door een tab op de nieuwe regel.

De afhankelijkheden specificeer de relatie van elk bestand met de bronbestanden. En de doel is een uitvoerbaar bestand en wordt gemaakt na de uitvoering van de make-opdracht.

Opties

Het make-commando biedt verschillende opties om het specifieker te maken. Enkele belangrijke opties zijn als volgt:

    -b, -m:Deze opties worden gebruikt om de compatibiliteit voor de verschillende versies van de make-opdracht te negeren.-B, --altijd maken:Deze opties worden gebruikt om onvoorwaardelijk alle doelen te bereiken.-C map, --map=map:Deze opties worden gebruikt om de map te wijzigen voordat het makefile wordt uitgevoerd.-D:Het wordt gebruikt om de foutopsporingsinformatie af te drukken.--debug[=VLAGGEN]:Het wordt gebruikt om de foutopsporingsinformatie samen met de normale verwerking af te drukken. Als we de vlag overslaan, worden vergelijkbare resultaten weergegeven als de optie '-d'.-e, --omgeving-overschrijvingen:Het wordt gebruikt om de variabelen uit de omgevingsvoorrang aan makefile te geven.-f bestand, --file=bestand, --makefile=BESTAND:Het wordt gebruikt om een ​​bestand als makefile te gebruiken.-i, --negeer-fouten:De optie '-i' wordt gebruikt om alle fouten in opdrachten te negeren.-I map, --include-dir=map:Het wordt gebruikt om een ​​map op te geven waarin naar het opgegeven make-bestand moet worden gezocht. Als we de vele '-I'-opties specificeren, zal er in de vele mappen worden gezocht in de aangegeven volgorde.-j [banen], --jobs[=banen]:Het wordt gebruikt om het aantal taken op te geven dat tegelijkertijd moet worden uitgevoerd. Als we veel '-j'-opties aanbieden, wordt aangenomen dat de laatste wordt uitgevoerd. Als we het aantal taken niet opgeven, beperkt dit niet het aantal taken dat tegelijkertijd kan worden uitgevoerd.-k, --doorgaan:Het wordt gebruikt om het programma zoveel mogelijk voort te zetten nadat er een fout is opgetreden.-l [belasting], --load-gemiddelde[=belasting]:Het wordt gebruikt om te specificeren dat er geen nieuwe taak mag worden gestart als er andere taken in de wachtrij staan ​​en de gemiddelde belasting minimaal is.-n, --just-print, --dry-run, --recon:Het wordt gebruikt om de opdracht weer te geven die zou worden uitgevoerd.-o bestand, --oud-bestand=bestand, --assume-oud=bestand:Het wordt gebruikt om ervoor te zorgen dat de make het bestand niet opnieuw zal maken, zelfs als het ouder is dan de afhankelijkheden ervan.-O[type], --output-sync[=type]:Het wordt gebruikt om te bevestigen dat de output van elke taak is samengesteld in plaats van een gemengde output van andere taken. Het is handig voor het verwerken van meerdere taken met de optie '-j'.-p, --print-database:Het wordt gebruikt om de database af te drukken die ontstaat na het lezen van de makefiles. Het is ook handig om de versie-informatie af te drukken bij gebruik van de '-v'-optie. Om de database af te drukken zonder te proberen bestanden opnieuw te maken, voert u de opdracht als volgt uit:
    make -p -f/dev/null.-q, --vraag:De optie '-q' wordt gebruikt voor de Vraagmodus. Er wordt geen opdracht uitgevoerd en er wordt niets afgedrukt. Er wordt alleen een afsluitstatus nul geretourneerd als het opgegeven doel al is gesynchroniseerd; anders wordt er een exit-status weergegeven die niet nul is.-r, --geen ingebouwde regels:Het wordt gebruikt om het gebruik van de ingebouwde impliciete regels te elimineren.-R, --geen ingebouwde variabelen:Het is handig als we geen ingebouwde variabele willen definiëren.-s, --stil, --stil:Deze opties worden genoemd Stille werking. Het beperkt het afdrukken van de opdrachten terwijl ze worden uitgevoerd.-S, --niet doorgaan, --stop:Het wordt gebruikt om het effect van de '-k, --keep-going'-bewerking te annuleren.-t, --raak aan:Het wordt gebruikt om bestanden aan te raken in plaats van hun opdrachten uit te voeren.--spoor:Het wordt gebruikt om de ligging van elk doelwit te traceren.-v, --versie:Het wordt gebruikt om de geïnstalleerde versie van het make-hulpprogramma af te drukken. Verder toont het een lijst met auteurs, copyright en enige kennisgeving met betrekking tot het make-hulpprogramma.-w, --print-directory:Het wordt gebruikt om een ​​afdrukbericht bij te houden dat een werkmap bevat voor en na andere verwerkingen. Het is handig om fouten op te sporen in de ingewikkelde structuur van recursieve make-opdrachten.--no-print-directory:Het wordt gebruikt om de '-w' optie uit te schakelen.-W bestand, --what-if=bestand, --new-file=bestand, --assume-new=bestand:Deze opties doen alsof het doelbestand zojuist is gewijzigd.--waarschuwing-ongedefinieerde-variabelen:Deze optie wordt gebruikt om te waarschuwen dat er naar een ongedefinieerde variabele wordt verwezen.

Laten we enkele voorbeelden van de opdracht make begrijpen. We zullen het basisgebruik van makefile zien, en verder zullen we enkele c++-programma's en een makefile maken. We zullen er enkele bewerkingen op uitvoeren om het make-commando beter te begrijpen.

java-typevariabele

Basisgebruik van make-opdracht

Laten we het basisgebruik van make command begrijpen, en het kan u helpen te begrijpen hoe het werkt.

Maak een map 'project' en wijzig de map ernaar. Overweeg de onderstaande opdrachten:

 mkdir project cd project 

Maak nu een 'Maakbestand' met de volgende inhoud voor het eerste programma:

 say_hello: echo 'Hello World!' 

Uit het bovenstaande bestand is de zeg_hello een doel dat zich gedraagt ​​als een functie in elke programmeertaal, en echo zal worden beschouwd als een actie. Houd er rekening mee dat actie moet worden geschreven met behulp van a TAB. Het doel en de actie vormen samen een regel voor het makefile. Voer nu het make-commando als volgt uit:

Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Uit de bovenstaande uitvoer kunnen we zien dat de echobewerking zelf wordt weergegeven. Als we het echo-commando niet op de uitvoer willen weergeven, voer dan de echo uit, beginnend met '@' symbool. Om de echo te onderdrukken, werkt u de inhoud van makefile als volgt bij:

 say_hello: @echo 'Hello World!' 

Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Een doel kan een binair bestand zijn dat afhankelijk is van de acties.

Laten we nog een paar doelen toevoegen, zoals genereren en weergeven in het makefile. Werk het makefile als volgt bij:

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

Als we het make-commando uitvoeren, wordt alleen het eerste doel uitgevoerd, omdat dit het standaarddoel van het make-bestand is. Beschouw de onderstaande uitvoer:

Linux maakt opdracht

We kunnen het standaarddoel wijzigen door onderstaande inhoud op te nemen in ons makefile:

databaseontwerp in dbms
 .DEFAULT_GOAL := generate 

Voeg het als volgt toe aan de eerste regel van het bestand:

Linux maakt opdracht

Het bovenstaande makefile beschouwt 'genereren' als het standaarddoel. Voer het make-commando uit en het geeft de volgende uitvoer:

Linux maakt opdracht

De optie DEFAULT GOAL voert slechts één doel uit om meer dan één doel op te geven om alle opties te gebruiken. Om meer dan één doel op te geven, werkt u de eerste regel van het makefile als volgt bij:

 all: say_hello generate 

Het zal het opgegeven doel uitvoeren. Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Er is nog een andere optie waarmee we alle doelen kunnen uitvoeren. Als we alle doelen van het makefile willen uitvoeren, update het bestand dan als volgt:

 .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 

Het bovenstaande bestand zal alle gespecificeerde doelen uitvoeren. Voer de make-opdracht uit, overweeg de onderstaande uitvoer:

Linux maakt opdracht

Geavanceerd gebruik van het make-commando

Laten we een C++-project maken met de bestanden main.cpp, function1.cpp, function2.cpp en een afhankelijkheidsbestand function.h.

De code van de bestanden is als volgt:

tekenreeks gesplitste java

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

functie1.cpp:

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

functie2.cpp:

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

functies.h:

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

Maak nu een uitvoerbaar bestand van het bovenstaande project door de onderstaande opdracht uit te voeren:

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

Met de bovenstaande opdracht wordt een uitvoerbaar bestand gemaakt 'Hallo' van de bestanden main.cpp, function1.cpp en function2.cpp.

Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Als de bovenstaande uitvoer met succes wordt uitgevoerd, zal deze geen enkele uitvoer opleveren.

Laten we dezelfde taak uitvoeren met behulp van het makefile.

Maak een bestand als Maakbestand en plaats onderstaande code erin.

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

Het trefwoord all wordt gebruikt voor doel en in de nieuwe regel wordt hetzelfde commando met een TAB geplaatst als hierboven om de bewerking te specificeren. Bewaar het bestand. Beschouw het onderstaande bestand:

Linux maakt opdracht

Om te werken, voert u de opdracht als volgt uit:

c programma voor tweedimensionale array
 make 

Met de bovenstaande opdracht wordt een uitvoerbaar bestand 'hallo' gemaakt van de opgegeven bestanden. Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Laten we nog wat taken toevoegen aan Makefile. Voeg een taak toe 'compileren' als volgt:

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

Om de taak uit te voeren compileren, voer het onderstaande commando uit:

 make compile 

Met het bovenstaande commando wordt de compileeropdracht uitgevoerd. Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Laten we nog wat taken uitvoeren in ons makefile.

update de Makefile als volgt:

 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 

Uit het bovenstaande make-bestand hebben we drie objecten gemaakt als main.o, function1.o en function2.o. Verder hebben we de afhankelijkheden voor de doelen main.o, function1.o en function2.o opgegeven als respectievelijk main.cpp, function1.cpp en function2.cpp. Alle doelen zullen de gespecificeerde taken daarin uitvoeren. We hebben ook een schoon doel gespecificeerd om alle afhankelijkheden op te schonen en het uitvoerbare bestand te verwijderen.

Voer nu het make all commando uit om ons nieuwe makefile uit te voeren.

 make all 

Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Uit de bovenstaande uitvoer kunnen we zien dat de opdracht eerst respectievelijk main.o, function1.o en function2.o uitvoerde. Het zal het uitvoerbare bestand en het objectenbestand van de gegeven bestanden maken. Het zal het schone doel niet uitvoeren omdat we het niet in hallo hebben gespecificeerd. Beschouw de onderstaande bestanden:

Linux maakt opdracht

Het make-commando heeft een eenvoudig werkproces. Het voerde de all-optie uit en ging naar hallo. Na de uitvoering van hallo leest het het doel in de opgegeven volgorde. Het doorzocht elk doelwit en zijn afhankelijkheid en voerde ze in de juiste volgorde uit.

Voer de opschoontaak uit om de objecten en het uitvoerbare bestand te verwijderen. Om de opschoontaak uit te voeren, voert u de opdracht als volgt uit:

 make clean 

Beschouw de onderstaande uitvoer:

Linux maakt opdracht

Met de bovenstaande opdracht worden alle objecten en uitvoerbare bestanden verwijderd. Zie de onderstaande module van de map:

Linux maakt opdracht

Uit de bovenstaande afbeelding kunnen we zien dat we onze directory hebben opgeschoond.

Variabelen in make-opdracht

We kunnen de variabelen definiëren in ons makefile. Om de variabelen te definiëren, gebruikt u de '=' exploitant. Als we bijvoorbeeld een variabele A willen maken en er een commando gcc aan willen toewijzen, wijs deze dan toe als:

cast string als int
 A=g++ 

Gebruik het als volgt in onze makefile:

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

Het wordt doorgegeven aan de terminal als:

 g++ hello.cpp -o hello 

We kunnen $(A) gebruiken in plaats van ${A}, omdat beide door het script op dezelfde manier worden behandeld.

Opmerkingen in makefile

Om een ​​opmerking aan het makefile toe te voegen, gebruikt u de '#' symbool. Als u bijvoorbeeld een opmerking wilt toevoegen aan de compileersectie, voegt u deze toe als '# Hiermee wordt het programma gecompileerd .' Opmerkingen worden door de compiler genegeerd.