logo

Linux make parancs

A Linux készítsenek A parancsot program- és fájlok csoportjainak felépítésére és karbantartására használják a forráskódból. Linuxban ez a fejlesztők egyik leggyakrabban használt parancsa. Segíti a fejlesztőket számos segédprogram telepítésében és fordításában a terminálról. Továbbá kezeli a jelentős projektek összeállítási folyamatát. Időt takarít meg az összeállításhoz.

A make parancs fő motívuma egy nagy program részekre bontása és annak ellenőrzése, hogy kell-e újrafordítani vagy sem. Ezenkívül kiadja az újrafordításhoz szükséges parancsokat.

Ebben a részben C++ programokat fogunk használni, mivel a C++ programozási nyelv egy objektumorientált nyelv, de bármilyen, a gépére telepített nyelv használható. Nem csak a programokra korlátozódik; más feladatok leírására is használhatjuk.

Hogyan működik a make parancs?

A make parancs a célokat argumentumként veszi fel. Ezek az argumentumok a 'Makefile'-ben vannak megadva. A makefile tartalmazza a célokat, valamint az ezekhez kapcsolódó műveleteket.

Amikor végrehajtjuk a make parancsot, megkeresi a makefile-t, és megvizsgálja, hogy megtalálja a célt, és hozzáférjen a függőségeihez. Ha a függőségek nincsenek megadva, akkor megkeresi a függőséget, és létrehozza azt. A függőségek felépítése után megépíti a fő célt.

Például, ha csak egy forrásfájlt szeretnénk megváltoztatni, és végrehajtjuk a make parancsot; tehát ez csak a forrásfájlhoz kapcsolódó objektumfájlt fordítja le. Rengeteg időt takarít meg a projekt végső összeállításánál.

Mi az a Makefile?

A make parancs meghívja a makefile végrehajtását. Ez egy speciális fájl, amely tartalmazza a projekt karbantartására létrehozott shell-parancsokat. A makefile célokat és végrehajtási parancsokat tartalmaz. Egynél több makefile létrehozása nem megengedett. Ajánlott külön könyvtárat létrehozni hozzá.

Nyomon követi a legutóbbi fájlokat, ezért csak azokat frissítse, amelyekre szükség van. Ha egy nagy programunk van sok forrásfájllal, akkor az összes függő fájlt újra kell fordítanunk. Tehát ez rendkívül időigényes folyamat lehet.

A makefile szabványlistát tartalmaz. Ezek a szabványok segítenek a rendszernek abban, hogy megértse, milyen parancsot akarunk végrehajtani. Ezek a szabványok két részből állnak, és egy új sor választja el őket. Az első sor az a függőségi vonal, és a következő sorokat úgy tekintjük cselekvések vagy parancsok s. Az új sorban a parancsokat tabulátor választja el.

A függőségek adja meg az egyes fájlok kapcsolatát a forrásfájlokkal. És a cél egy végrehajtható fájl, és a make parancs végrehajtása után jön létre.

Lehetőségek

A make parancs különféle opciókat tesz lehetővé, hogy pontosabbá tegye. Néhány fontos lehetőség a következő:

    -b, -m:Ezekkel az opciókkal figyelmen kívül kell hagyni a make parancs különböző verzióinak kompatibilitását.-B, --mindig-make:Ezek az opciók az összes cél feltétel nélküli meghatározására szolgálnak.-C könyvtár, --directory=dir:Ezekkel az opciókkal módosíthatja a könyvtárat a makefile végrehajtása előtt.-d:A hibakeresési információk kinyomtatására szolgál.--debug[=FLAGS]:A hibakeresési információk kinyomtatására szolgál a normál feldolgozás mellett. Ha kihagyjuk a zászlót, akkor hasonló eredményeket fog mutatni, mint a '-d' opció.-e, --environment-overrides:A környezeti prioritástól a makefile-ig átvett változók biztosítására szolgál.-f fájl, --file=fájl, --makefile=FILE:Egy fájl makefile-ként való használatára szolgál.-i, --ignore-errors:A „-i” opció a parancsok összes hibájának figyelmen kívül hagyására szolgál.-I dir, --include-dir=dir:A megadott makefile keresésére szolgáló könyvtár megadására szolgál. Ha megadjuk a sok '-I' opciót, akkor a megadott sorrendben fog keresni a sok könyvtárban.-j [munka], --jobs[=munka]:Az egyidejűleg futtatandó jobok számának megadására szolgál. Ha sok '-j' opciót adunk meg, akkor az utolsót tekintjük végrehajtottnak. Ha nem adjuk meg a jobok számát, az nem korlátozza az egyidejűleg futtatható jobokat.-k, -- folytasd:Ez arra szolgál, hogy hiba jelentkezése után minél tovább folytassa a programot.-l [terhelés], --load-average[=terhelés]:Arra használják, hogy ne indítsanak el új feladatot, ha más feladatok is vannak a sorban, és a terhelési átlag a minimumon van.-n, --just-print, --dry-run, --recon:A futtatandó parancs megjelenítésére szolgál.-o fájl, --old-file=file, --assume-old=file:Arra szolgál, hogy biztosítsa, hogy a gyártó ne készítse újra a fájlt, még akkor sem, ha az régebbi, mint a függőségei.-O[típus], --output-sync[=típus]:Arra szolgál, hogy megerősítse, hogy az egyes feladatok kimenete össze van állítva, nem pedig más feladatok kevert kimenete. Hasznos több feladat feldolgozásához a '-j' opcióval.-p, --print-data-base:A makefile-ok elolvasása után létrejövő adatbázis kinyomtatására szolgál. Hasznos a verzióinformációk kinyomtatása is, ha a '-v' opcióval együtt használjuk. Ha ki szeretné nyomtatni az adatbázist anélkül, hogy megpróbálna újrakészíteni a fájlokat, hajtsa végre a következő parancsot:
    tegye a -p -f/dev/null értékre.-q, --question:A '-q' opciót a Kérdés mód. Nem fog parancsot futtatni és semmit nem nyomtat ki. Csak akkor ad vissza nulla kilépési állapotot, ha a megadott cél már szinkronizálva van; ellenkező esetben nem nulla kilépési állapotot jelenít meg.-r, --no-builtin-rules:A beépített implicit szabályok használatának kiküszöbölésére szolgál.-R, --no-builtin-variables:Akkor hasznos, ha nem akarunk semmilyen beépített változót definiálni.-s, --néma, --csendes:Ezeket az opciókat hívják Csendes működés. Korlátozza a parancsok kinyomtatását végrehajtásuk közben.-S, --no-keep-going, --stop:A '-k, --keep-going' művelet hatásának megszüntetésére szolgál.-t, --touch:A parancsok futtatása helyett a fájlok érintésére szolgál.--nyom:Az egyes célpontok elhelyezkedésének nyomon követésére szolgál.-v, --verzió:A make segédprogram telepített verziójának kinyomtatására szolgál. Ezenkívül megjeleníti a szerzők listáját, a szerzői jogokat és néhány megjegyzést a make segédprogrammal kapcsolatban.-w, --print-könyvtár:A munkakönyvtárat tartalmazó nyomtatási üzenet nyomon követésére szolgál más feldolgozás előtt és után. Hasznos a hibákat a rekurzív make parancs bonyolult szerkezetéből kikeresni.--no-print-directory:A '-w' opció kikapcsolására szolgál.-W fájl, --what-if=file, --new-file=file, --assume-new=file:Ezek a beállítások úgy tesznek, mintha a célfájlt most módosították volna.--warn-undefined-variables:Ez az opció arra szolgál, hogy figyelmeztesse, ha egy nem definiált változóra hivatkozik.

Nézzünk meg néhány példát a make parancsra. Látni fogjuk a makefile alaphasználatát, majd létrehozunk néhány c++ programot és egy makefile-t. Néhány műveletet végrehajtunk rajtuk, hogy jobban megértsük a make parancsot.

mac operációs rendszerek

A make parancs alapvető használata

Ismerjük meg a make parancs alapvető használatát, és segíthet megérteni, hogyan működik.

Hozzon létre egy 'projekt' könyvtárat, és módosítsa a könyvtárat. Vegye figyelembe az alábbi parancsokat:

 mkdir project cd project 

Most hozzon létre a 'Makefile' a következő tartalommal rendelkezik az első programhoz:

 say_hello: echo 'Hello World!' 

A fenti fájlból a say_hello egy olyan cél, amely bármely programozási nyelvben függvényként viselkedik, és az echo műveletnek minősül. Emlékeztetni kell arra, hogy a műveletet az a segítségével kell megírni TAB. A cél és a cselekvés együtt alkot egy szabályt a makefile számára. Most hajtsa végre a make parancsot az alábbiak szerint:

Vegye figyelembe az alábbi kimenetet:

Linux make parancs

A fenti kimenetből láthatjuk, hogy maga a visszhangművelet jelenik meg. Ha nem akarjuk megjeleníteni az echo parancsot a kimeneten, akkor hajtsa végre az echo-t a következővel kezdve '@' szimbólum. A visszhang elnyomásához frissítse a makefile tartalmát az alábbiak szerint:

 say_hello: @echo 'Hello World!' 

Vegye figyelembe az alábbi kimenetet:

Linux make parancs

A cél lehet egy bináris fájl, amely a műveletektől függ.

Adjunk hozzá még néhány célt, például generálást és listázást a makefile-ban. Frissítse a makefile-t az alábbiak szerint:

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

Ha végrehajtjuk a make parancsot, akkor csak az első célt hajtja végre, mert ez a makefile alapértelmezett célja. Vegye figyelembe az alábbi kimenetet:

Linux make parancs

Megváltoztathatjuk az alapértelmezett célt az alábbi tartalom felvételével a makefile-unkba:

dfa automata példák
 .DEFAULT_GOAL := generate 

Adja hozzá a fájl első sorához a következőképpen:

Linux make parancs

A fenti makefile a „generate”-t tekinti alapértelmezett célnak. Hajtsa végre a make parancsot, és az a következőképpen adja ki a kimenetet:

Linux make parancs

Az ALAPÉRTELMEZETT CÉL beállítás csak egy célt hajt végre, hogy egynél több célt adjon meg az összes beállítás használatához. Egynél több cél megadásához frissítse a makefile első sorát az alábbiak szerint:

 all: say_hello generate 

Ez végrehajtja a megadott célt. Vegye figyelembe az alábbi kimenetet:

Linux make parancs

Van egy másik lehetőség, amely lehetővé teszi az összes cél végrehajtását. Ha a makefile összes célját szeretnénk végrehajtani, frissítsük a fájlt az alábbiak szerint:

 .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 

A fenti fájl végrehajtja az összes megadott célt. Hajtsa végre a make parancsot, vegye figyelembe az alábbi kimenetet:

Linux make parancs

A make parancs speciális használata

Hozzunk létre egy C++ projektet main.cpp, function1.cpp, function2.cpp fájlokkal és egy function.h függőségi fájllal.

A fájlok kódja a következő:

válasszon több sql táblából

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

Most hozzon létre egy végrehajtható fájlt a fenti projektből az alábbi parancs végrehajtásával:

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

A fenti parancs végrehajtható fájlt hoz létre 'Helló' a main.cpp, function1.cpp és function2.cpp fájlok közül.

Vegye figyelembe az alábbi kimenetet:

Linux make parancs

A fenti kimenetből, ha sikeresen lefut, nem ad semmilyen kimenetet.

Végezzük el ugyanezt a feladatot a makefile használatával.

Hozzon létre egy fájlt mint Makefile és tedd bele az alábbi kódot.

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

Az all kulcsszót a célként használjuk, és az új sorba ugyanazt a parancsot írjuk be TAB-bal, mint fent a művelet megadásához. Mentse el a fájlt. Vegye figyelembe az alábbi fájlt:

Linux make parancs

A működéshez hajtsa végre a parancsot az alábbiak szerint:

java a huroktípusokhoz
 make 

A fenti parancs a megadott fájlok közül egy 'hello' futtatható fájlt hoz létre. Vegye figyelembe az alábbi kimenetet:

Linux make parancs

Adjunk hozzá még néhány feladatot a Makefile-hoz. Adjon hozzá egy feladatot 'összeállítás' alábbiak szerint:

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

A feladat végrehajtásához összeállítani, hajtsa végre az alábbi parancsot:

 make compile 

A fenti parancs végrehajtja a fordítási feladatot. Vegye figyelembe az alábbi kimenetet:

Linux make parancs

Végezzünk el még néhány feladatot a makefile-unkon.

frissítse a Makefile-t az alábbiak szerint:

 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 fenti makefile-ből három objektumot hoztunk létre main.o, function1.o és function2.o néven. Továbbá megadtuk a main.o, function1.o és function2.o célok függőségeit main.cpp, function1.cpp és function2.cpp néven. Az összes célpont elvégzi a megadott feladatokat benne. Meghatároztunk egy tiszta célt is az összes függőség megtisztításához és a végrehajtható fájl eltávolításához.

Most hajtsa végre a make all parancsot az új makefile végrehajtásához.

 make all 

Vegye figyelembe az alábbi kimenetet:

Linux make parancs

A fenti kimenetből láthatjuk, hogy a parancs először végrehajtotta a main.o, function1.o és function2.o fájlokat. Ez létrehozza az adott fájlok végrehajtható és objektumfájlját. Nem hajtja végre a tiszta célt, mert nem adtuk meg a hello-ban. Vegye figyelembe az alábbi fájlokat:

Linux make parancs

A make parancsnak egyenesen előrehaladó munkafolyamata van. Végrehajtotta az összes opciót, és a hello-ra ment. A hello végrehajtása után a megadott sorrendben beolvassa a célt. Minden célpontot és annak függőségét átkutatta, és sorrendben végrehajtotta.

Az objektumok és a végrehajtható fájl eltávolításához hajtsa végre a tisztítási feladatot. A tisztítási feladat végrehajtásához hajtsa végre a következő parancsot:

 make clean 

Vegye figyelembe az alábbi kimenetet:

Linux make parancs

A fenti parancs eltávolítja az összes objektumot és végrehajtható fájlt. Tekintse meg a könyvtár alábbi képét:

Linux make parancs

A fenti képen láthatjuk, hogy megtisztítottuk a könyvtárunkat.

Változók a make parancsban

Meghatározhatjuk a változókat a makefile-unkban. A változók meghatározásához használja a '=' operátor. Például, ha szeretnénk létrehozni egy A változót, és hozzá szeretnénk rendelni egy gcc parancsot, akkor a következőképpen rendeljük hozzá:

osi referenciamodell a hálózatépítésben
 A=g++ 

Használja a következőképpen a makefile-unkban:

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

Ez a következőképpen kerül át a terminálba:

 g++ hello.cpp -o hello 

${A} helyett használhatjuk a $(A)-t, mivel mindkettőt ugyanúgy kezeli a szkript.

Megjegyzések a makefile-ban

Ha megjegyzést szeretne hozzáadni a makefile-hez, használja a '#' szimbólum. Ha például megjegyzést szeretne hozzáadni a fordítási szakaszhoz, adja hozzá a következőként '# Ezzel lefordítja a programot .' A megjegyzéseket a fordító figyelmen kívül hagyja.