logo

Linux make-Befehl

Das Linux machen Der Befehl wird verwendet, um Gruppen von Programmen und Dateien aus dem Quellcode zu erstellen und zu verwalten. Unter Linux ist es einer der von den Entwicklern am häufigsten verwendeten Befehle. Es unterstützt Entwickler bei der Installation und Kompilierung vieler Dienstprogramme vom Terminal aus. Darüber hinaus übernimmt es den Kompilierungsprozess der großen Projekte. Es spart Kompilierungszeit.

Das Hauptmotiv des Make-Befehls besteht darin, ein großes Programm in Teile zu zerlegen und zu prüfen, ob es neu kompiliert werden muss oder nicht. Außerdem erteilt es die notwendigen Befehle, um sie neu zu kompilieren.

In diesem Abschnitt verwenden wir C++-Programme, da die Programmiersprache C++ eine objektorientierte Sprache ist, Sie können jedoch jede auf Ihrem Computer installierte Sprache verwenden. Es ist nicht nur auf Programme beschränkt; Wir können damit auch andere Aufgaben beschreiben.

Wie funktioniert der Make-Befehl?

Der Befehl make akzeptiert Ziele als Argumente. Diese Argumente werden in „Makefile“ angegeben. Das Makefile enthält die Ziele sowie zugehörige Aktionen im Zusammenhang mit diesen Zielen.

Wenn wir den Befehl „make“ ausführen, sucht er nach dem Makefile und scannt es, um das Ziel zu finden und auf seine Abhängigkeiten zuzugreifen. Wenn keine Abhängigkeiten angegeben sind, wird nach der Abhängigkeit gesucht und diese erstellt. Es wird das Hauptziel erstellen, nachdem die Abhängigkeiten erstellt wurden.

Wenn wir beispielsweise nur eine Quelldatei ändern möchten und den Befehl make ausführen; Dadurch wird also nur die Objektdatei kompiliert, die mit dieser Quelldatei verbunden ist. Dies spart viel Zeit bei der endgültigen Zusammenstellung des Projekts.

Was ist Makefile?

Der Befehl make ruft die Ausführung des Makefiles auf. Es handelt sich um eine spezielle Datei, die die Shell-Befehle enthält, die wir zur Verwaltung des Projekts erstellen. Das Makefile enthält Ziele und Befehle zur Ausführung. Es ist nicht erlaubt, mehr als ein Makefile zu erstellen. Es empfiehlt sich, dafür ein eigenes Verzeichnis anzulegen.

Es verfolgt die zuletzt verwendeten Dateien. Aktualisieren Sie daher nur die Dateien, die erforderlich sind. Wenn wir ein großes Programm mit vielen Quelldateien haben, müssen wir alle abhängigen Dateien neu kompilieren. Es kann also ein äußerst zeitaufwändiger Prozess sein.

Das Makefile enthält eine Liste von Standards. Diese Standards sind hilfreich, damit das System versteht, welchen Befehl wir ausführen möchten. Diese Standards bestehen aus zwei Teilen und werden durch eine neue Zeile getrennt. Die erste Zeile ist die Abhängigkeitslinie, und die nachfolgenden Zeilen werden als betrachtet Aktionen oder Befehle S. Die Befehle werden in der neuen Zeile durch einen Tabulator getrennt.

Der Abhängigkeiten Geben Sie die Beziehung jeder Datei zu den Quelldateien an. Und das Ziel ist eine ausführbare Datei und wird nach der Ausführung des Befehls make erstellt.

Optionen

Der Make-Befehl ermöglicht verschiedene Optionen, um es spezifischer zu machen. Einige wichtige Optionen sind wie folgt:

    -b, -m:Diese Optionen werden verwendet, um die Kompatibilität für die verschiedenen Versionen des Befehls make zu ignorieren.-B, --always-make:Diese Optionen werden verwendet, um alle Ziele bedingungslos festzulegen.-C dir, --directory=dir:Diese Optionen werden verwendet, um das Verzeichnis vor der Ausführung des Makefiles zu ändern.-D:Es wird zum Drucken der Debugging-Informationen verwendet.--debug[=FLAGS]:Es wird verwendet, um die Debugging-Informationen zusammen mit der normalen Verarbeitung auszudrucken. Wenn wir das Flag überspringen, werden ähnliche Ergebnisse angezeigt wie bei der Option „-d“.-e, --environment-overrides:Es wird verwendet, um die aus der Umgebung übernommenen Variablen vorrangig dem Makefile bereitzustellen.-f Datei, --file=Datei, --makefile=DATEI:Es wird verwendet, um eine Datei als Makefile zu verwenden.-i, --ignore-errors:Die Option „-i“ wird verwendet, um alle Fehler in Befehlen zu ignorieren.-I dir, --include-dir=dir:Es wird verwendet, um ein Verzeichnis anzugeben, in dem nach dem angegebenen Makefile gesucht werden soll. Wenn wir die vielen „-I“-Optionen angeben, wird in den vielen Verzeichnissen in der angegebenen Reihenfolge gesucht.-j [Jobs], --jobs[=Jobs]:Es wird verwendet, um die Anzahl der gleichzeitig auszuführenden Jobs anzugeben. Wenn wir viele „-j“-Optionen bereitstellen, wird davon ausgegangen, dass die letzte ausgeführt wird. Wenn wir die Anzahl der Jobs nicht angeben, wird die Anzahl der Jobs, die gleichzeitig ausgeführt werden können, nicht begrenzt.-k, --keep-going:Es wird verwendet, um das Programm so weit wie möglich fortzusetzen, nachdem ein Fehler aufgetreten ist.-l [Laden], --load-average[=Laden]:Es wird verwendet, um festzulegen, dass keine neue Aufgabe gestartet werden soll, wenn sich andere Aufgaben in der Warteschlange befinden und die durchschnittliche Auslastung am niedrigsten ist.-n, --just-print, --dry-run, --recon:Es wird verwendet, um den Befehl anzuzeigen, der ausgeführt werden würde.-o Datei, --old-file=Datei, --assume-old=Datei:Es wird verwendet, um sicherzustellen, dass der Hersteller die Datei nicht neu erstellt, selbst wenn sie älter als ihre Abhängigkeiten ist.-O[Typ], --output-sync[=Typ]:Es wird verwendet, um zu bestätigen, dass die Ausgabe jeder Aufgabe zusammengesetzt ist und nicht eine gemischte Ausgabe anderer Aufgaben. Dies ist nützlich für die Verarbeitung mehrerer Jobs mit der Option „-j“.-p, --print-data-base:Es wird zum Drucken der Datenbank verwendet, die nach dem Lesen der Makefiles entsteht. Es ist auch nützlich, die Versionsinformationen auszudrucken, wenn die Option „-v“ verwendet wird. Um die Datenbank zu drucken, ohne zu versuchen, Dateien neu zu erstellen, führen Sie den Befehl wie folgt aus:
    make -p -f/dev/null.-q, --quest:Dafür wird die Option „-q“ verwendet Fragemodus. Es wird kein Befehl ausgeführt oder etwas gedruckt. Es wird nur dann ein Exit-Status von Null zurückgegeben, wenn das angegebene Ziel bereits synchronisiert ist. andernfalls wird ein Exit-Status ungleich Null angezeigt.-r, --no-builtin-rules:Es wird verwendet, um die Verwendung der integrierten impliziten Regeln zu verhindern.-R, --no-builtin-variables:Dies ist nützlich, wenn wir keine integrierte Variable definieren möchten.-s, --silent, --quiet:Diese Optionen werden aufgerufen Leiser Betrieb. Es beschränkt sich darauf, die Befehle so auszudrucken, wie sie ausgeführt werden.-S, --no-keep-going, --stop:Es wird verwendet, um die Wirkung der Operation „-k, --keep-going“ aufzuheben.-t, --touch:Es wird verwendet, um Dateien zu berühren, anstatt deren Befehle auszuführen.--verfolgen:Es wird verwendet, um die Disposition jedes Ziels zu verfolgen.-v, --version:Es wird verwendet, um die installierte Version des Make-Dienstprogramms zu drucken. Darüber hinaus werden eine Liste der Autoren, das Urheberrecht und einige Hinweise zum Make-Dienstprogramm angezeigt.-w, --print-directory:Es wird verwendet, um eine Drucknachricht, die ein Arbeitsverzeichnis enthält, vor und nach anderer Verarbeitung zu verfolgen. Es ist nützlich, Fehler aus der komplizierten Struktur des rekursiven Make-Befehls aufzuspüren.--no-print-directory:Es wird verwendet, um die Option „-w“ zu deaktivieren.-W Datei, --what-if=Datei, --new-file=Datei, --assume-new=Datei:Diese Optionen geben vor, dass die Zieldatei gerade geändert wurde.--warn-undefinierte-Variablen:Diese Option wird verwendet, um zu warnen, dass auf eine undefinierte Variable verwiesen wird.

Lassen Sie uns einige Beispiele des Befehls make verstehen. Wir werden die grundlegende Verwendung von Makefile sehen und außerdem einige C++-Programme und ein Makefile erstellen. Wir werden einige Operationen an ihnen durchführen, um den Befehl make besser zu verstehen.

Java-Visualizer

Grundlegende Verwendung des Make-Befehls

Lassen Sie uns die grundlegende Verwendung des Befehls „make“ verstehen, und es kann Ihnen helfen, zu verstehen, wie er funktioniert.

Erstellen Sie ein Verzeichnis „Projekt“ und ändern Sie das Verzeichnis dorthin. Betrachten Sie die folgenden Befehle:

Java do while-Beispiel
 mkdir project cd project 

Erstellen Sie nun eine 'Makefile' mit folgendem Inhalt für das erste Programm:

 say_hello: echo 'Hello World!' 

Aus der obigen Datei geht hervor, dass say_hello ein Ziel ist, das sich in jeder Programmiersprache wie eine Funktion verhält, und echo wird als Aktion betrachtet. Es muss daran erinnert werden, dass die Aktion mit a geschrieben werden sollte TAB. Das Ziel und die Aktion bilden zusammen eine Regel für das Makefile. Führen Sie nun den Make-Befehl wie folgt aus:

Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Aus der obigen Ausgabe können wir sehen, dass die Echo-Operation selbst angezeigt wird. Wenn wir den Echo-Befehl nicht in der Ausgabe anzeigen möchten, führen Sie den Echo-Befehl beginnend mit aus '@' Symbol. Um das Echo zu unterdrücken, aktualisieren Sie den Inhalt des Makefiles wie folgt:

 say_hello: @echo 'Hello World!' 

Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Ein Ziel kann eine Binärdatei sein, die von den Aktionen abhängt.

Fügen wir noch ein paar weitere Ziele hinzu, z. B. „generate“ und „list“ im Makefile. Aktualisieren Sie das Makefile wie folgt:

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

Wenn wir den Befehl „make“ ausführen, wird nur das erste Ziel ausgeführt, da es das Standardziel des Makefiles ist. Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Wir können das Standardziel ändern, indem wir den folgenden Inhalt in unser Makefile einfügen:

 .DEFAULT_GOAL := generate 

Fügen Sie es wie folgt in die erste Zeile der Datei ein:

Linux make-Befehl

Das obige Makefile betrachtet „generieren“ als Standardziel. Führen Sie den Befehl „make“ aus und die Ausgabe lautet wie folgt:

Linux make-Befehl

Die Option DEFAULT GOAL führt nur ein Ziel aus, um mehr als ein Ziel anzugeben, um alle Optionen zu verwenden. Um mehr als ein Ziel anzugeben, aktualisieren Sie die erste Zeile des Makefiles wie folgt:

 all: say_hello generate 

Es wird das angegebene Ziel ausführen. Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Es gibt eine weitere Option, die es uns ermöglicht, alle Ziele auszuführen. Wenn wir alle Ziele des Makefiles ausführen möchten, aktualisieren Sie die Datei wie folgt:

 .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 

Die obige Datei führt alle angegebenen Ziele aus. Führen Sie den Befehl make aus und betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Erweiterte Verwendung des Befehls make

Erstellen wir ein C++-Projekt mit den Dateien main.cpp, function1.cpp, function2.cpp und einer Abhängigkeitsdatei function.h.

Der Code der Dateien lautet wie folgt:

Vererbung Java

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

Funktionen.h:

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

Erstellen Sie nun eine ausführbare Datei des oben genannten Projekts, indem Sie den folgenden Befehl ausführen:

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

Der obige Befehl erstellt eine ausführbare Datei 'Hallo' der Dateien main.cpp, function1.cpp und function2.cpp.

Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Wenn die obige Ausgabe erfolgreich ausgeführt wird, wird keine Ausgabe ausgegeben.

Führen wir dieselbe Aufgabe mithilfe des Makefiles aus.

Erstellen Sie eine Datei als Makefile und fügen Sie den folgenden Code ein.

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

Das Schlüsselwort all wird für das Ziel verwendet. Geben Sie in der neuen Zeile denselben Befehl mit einem TAB wie oben ein, um die Operation anzugeben. Speicher die Datei. Betrachten Sie die folgende Datei:

Linux make-Befehl

Führen Sie zum Betrieb den Befehl wie folgt aus:

Welche Monate sind im dritten Quartal?
 make 

Der obige Befehl erstellt eine ausführbare Datei „Hallo“ der angegebenen Dateien. Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Fügen wir Makefile weitere Aufgaben hinzu. Fügen Sie eine Aufgabe hinzu 'kompilieren' wie folgt:

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

Um die Aufgabe auszuführen kompilieren, Führen Sie den folgenden Befehl aus:

 make compile 

Der obige Befehl führt die Kompilierungsaufgabe aus. Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Lassen Sie uns noch einige weitere Aufgaben für unser Makefile ausführen.

Aktualisieren Sie das Makefile wie folgt:

 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 

Aus dem obigen Makefile haben wir drei Objekte als main.o, function1.o und function2.o erstellt. Darüber hinaus haben wir die Abhängigkeiten für die Ziele main.o, function1.o und function2.o jeweils als main.cpp, function1.cpp und function2.cpp bereitgestellt. Alle Ziele führen darin die angegebenen Aufgaben aus. Wir haben außerdem ein sauberes Ziel angegeben, um alle Abhängigkeiten zu bereinigen und die ausführbare Datei zu entfernen.

Führen Sie nun den Befehl „make all“ aus, um unser neues Makefile auszuführen.

 make all 

Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Aus der obigen Ausgabe können wir ersehen, dass der Befehl zuerst main.o, function1.o bzw. function2.o ausgeführt hat. Es erstellt die ausführbare Datei und die Objektdatei der angegebenen Dateien. Das saubere Ziel wird nicht ausgeführt, da wir es in „Hallo“ nicht angegeben haben. Betrachten Sie die folgenden Dateien:

Linux make-Befehl

Der Make-Befehl hat einen unkomplizierten Arbeitsprozess. Es führte die Option „Alle“ aus und ging zu „Hallo“. Nach der Ausführung von „hello“ wird das Ziel in der angegebenen Reihenfolge gelesen. Es durchsuchte jedes Ziel und seine Abhängigkeiten und führte sie der Reihe nach aus.

Um die Objekte und die ausführbare Datei zu entfernen, führen Sie die Bereinigungsaufgabe aus. Um die Bereinigungsaufgabe auszuführen, führen Sie den Befehl wie folgt aus:

 make clean 

Betrachten Sie die folgende Ausgabe:

Linux make-Befehl

Der obige Befehl entfernt alle Objekte und ausführbaren Dateien. Sehen Sie sich den folgenden Ausschnitt des Verzeichnisses an:

Linux make-Befehl

Auf dem obigen Bild können wir sehen, dass wir unser Verzeichnis bereinigt haben.

Variablen im Make-Befehl

Wir können die Variablen in unserem Makefile definieren. Um die Variablen zu definieren, verwenden Sie die '=' Operator. Wenn wir beispielsweise eine Variable A erstellen und ihr einen Befehl gcc zuweisen möchten, weisen Sie ihn wie folgt zu:

Java und Swing
 A=g++ 

Verwenden Sie es wie folgt in unserem Makefile:

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

Es wird an das Terminal übergeben als:

 g++ hello.cpp -o hello 

Wir können $(A) anstelle von ${A} verwenden, da beide vom Skript gleich behandelt werden.

Kommentare im Makefile

Um einen Kommentar zum Makefile hinzuzufügen, verwenden Sie die '#' Symbol. Um beispielsweise einen Kommentar im Kompilierungsabschnitt hinzuzufügen, fügen Sie ihn als hinzu '# Dadurch wird das Programm kompiliert .' Kommentare werden vom Compiler ignoriert.