GNU Make ist ein wesentliches Instrument zum Erstellen und Verwalten der Projekte, insbesondere wenn das Projekt verschiedene Dateien enthält, die mit verschiedenen Tools erstellt werden. In diesem Fall findet der GNU das Makefile für dieses Projekt so, dass die Datei die erforderlichen Abhängigkeiten zwischen verschiedenen Dateien im angegebenen Projekt und die Befehle angibt, die zum Erstellen des Projekts erforderlich sind.
GNU Make ist für die Behandlung großer Projekte ausgelegt. Es bestimmt die Abschnitte eines Programms, das nach einer bestimmten Aktion neu kompiliert werden muss, und bietet die Befehle, um die Abschnitte neu zu kompilieren. Der heutige Beitrag bietet einen praktischen Leitfaden, um alles über GNU Make zu verstehen.
Ein Makefile verstehen
GNU MACHEN SIE DIE MAKEFILE eines Projekts, um zu bestimmen, was es tun sollte, um das Projekt zu erstellen und zu verwalten. Ein Makefile verfügt über drei Schlüsselkomponenten: Ziel, Voraussetzung und Rezept.
A Ziel repräsentiert die Datei, dass die “machenBefehl kann erzeugen. Das Ziel kann von den Voraussetzungen abhängen und kann auch eine Maßnahme sein, die ausgeführt werden muss. Im Idealfall beleuchtet das Ziel die zu erstellende Datei, sobald wir die ausführen “machen" Befehl.
A Voraussetzung repräsentiert die Datei, die als Eingabe zum Erstellen des Ziels verwendet wird. Ein Ziel kann von mehreren Voraussetzungen abhängen.
A Rezept ist eine Aktion oder ein Befehl, der von “durchgeführt wird“machen”Um das Ziel neu zu kompilieren, wenn sich die Voraussetzung ändert. Das Rezept kann unterschiedliche Befehle in denselben oder verschiedenen Zeilen enthalten. A Registerkartenraum geht jeder neuen Rezeptlinie voraus, und der Editor erhöht einen Fehler, wenn Sie das Hinzufügen des Registerkartenzeichens verpassen.
Der Rezept fungiert als eine Reihe von Shell -Befehlen, beginnend mit einem Registerkarte Charakter. Hier ist ein Beispiel für ein einfaches Makefile, das das Ziel, die Voraussetzungen und das Rezept hervorhebt:
Das bereitgestellte Makefile besteht aus einer Regel im Rezept. Beachten Sie, dass Make die erste Regel im Makefile als Standardregel verwendet wird. Also in einem solchen Makefile ““machen”Verwendet die gcc -o willkommen großartig.C in der Regel, das Projekt zu erstellen und zu verwalten. Die Regel gibt an, dass Sie die Datei zum Generieren der Datei erstellen können Willkommen Datei, wir müssen den Befehl ausführen, der das verwendet Großartig.C als Eingabe, um die zu erstellen Willkommen Datei.
Auch hier haben nicht alle Regeln eine Voraussetzung. Wenn Sie beispielsweise eine Makefile zum Löschen der Zwischendateien haben, die beim Erstellen einer Datei erstellt werden, hat eine solche Regel keine Voraussetzung. Schauen Sie sich das folgende Beispiel an:
In diesem Fall löscht die Regel alle Dateien, die a * enthalten.o Erweiterung. Daher ist in einem solchen Fall eine Voraussetzung nicht erforderlich, da keine Neukompilierung des Ziels erforderlich ist.
Arbeiten mit einem Makefile
Das erste Beispiel ist ein einfaches C -Projekt mit zwei C -Dateien und einer Header -Datei. Wir erstellen eine Funktion, die eine willkommene Nachricht druckt und eine externe Header -Datei in unserem Projekt enthält.
Hier ist die Hauptfunktion:
Unsere Header -Dateien sehen nach wie vor:
Erstellen wir nun ein Makefile, das die Projektdateien zum Erstellen einer ausführbaren Datei im aktuellen Verzeichnis zusammenstellt. Im Idealfall führen wir den folgenden Befehl aus, um das Projekt zu erstellen:
$ gcc -o großer Mainfunc.C func1.c -i.
Im folgenden Bild können wir feststellen, wie das Kompilieren das Projekt erfolgreich erstellt. Wenn wir die erstellte ausführbare Datei ausführen, erhalten wir die gewünschte Ausgabe.
Wie können wir dasselbe darstellen und stattdessen ein Makefile verwenden?? Hier ist die Sache: Obwohl das direkte Kompilieren des Projekts in der Befehlszeile einwandfrei funktioniert, kommt das Problem bei, wenn Sie die Computer wechseln oder den Kompilierungscode verlieren. In einem solchen Fall müssen Sie das Projekt neu kompilieren. Wenn Sie Änderungen an einer Datei vornehmen, müssen Sie das Projekt manuell neu kompilieren, um den Änderungen gerecht zu werden.
All diese Probleme können ausgeschlossen werden, indem ein einfaches Makefile erstellt wird, wie im Folgenden gezeigt:
Das Makefile enthält zwei Ziele: eine mit Voraussetzungen und einen Befehl und der andere mit nur dem Befehl.
Früher haben wir das bemerkt "machen”Verwendet den ersten Befehl als Standardbefehl zum Erstellen des Projekts. Daher können wir tippen machen im Projektverzeichnis, um den Befehl zum Erstellen des Projekts auszuführen. Der Befehl make erzeugt das Ziel, das ist Großartige als ausführbare Datei. Schauen Sie sich Folgendes an:
Jetzt können wir die ausführbare Datei bequem ausführen, um die Ausgabe des erstellten Projekts anzuzeigen.
$ ./Ausgabedatei
Angenommen, wir verwenden “machenUm einen anderen Befehl anstelle des Standards auszuführen. Geben Sie das Ziel an, das Sie mit dem Befehl machen möchten.
$ machen Ziel
Verwenden wir das gleiche Makefile und verwenden die Hallo Ziel:
Beachten Sie, wie wir es schaffen, zu bekommen “machenUm den Befehl auszuführen, da keine Voraussetzungen mit dem Ziel angegeben werden.
Wenn wir einige Änderungen an einem der Dateien im Projekt vornehmen, werden die “ausgeführtmachenDer Befehl nimmt die Änderungen an, ohne das Projekt manuell neu zu kompilieren müssen.
Trotzdem, wenn Sie das laufen “machen"Befehl ohne neue Änderungen"machenBenachrichtigt Sie, dass die ausführbare Datei auf dem neuesten Stand ist.
Nehmen wir an, Sie sind sich nicht sicher über die von Ihnen vorgenommenen Änderungen oder wie der Befehl make bei der Ausführung tut. Sie können einen trockenen Lauf durchführen, indem Sie das -n -Flag hinzufügen.
Das erste Beispiel in der folgenden Abbildung, das machen -N, Zeigt den Befehl an, der mit dem Standardbefehl ausgeführt wird. Im nächsten Fall zeigt das Make -n die Änderungen an, die dem Hello -Ziel hinzugefügt werden.
Wenn Sie mit den Änderungen vertraut sind, können Sie den Befehl machen, das das angegebene Ziel zu erhalten, um die Änderungen wie im folgenden Beispiel zu berücksichtigen:
So verwenden Sie die Makefile -Variablen
Bisher haben wir verstanden, wie “machenFunktioniert mit einem Makefile. Unser bisheriger Ansatz ist jedoch nicht der beste, um große Projekte zu bewältigen, insbesondere wenn sich einige Werte mit der Zeit ändern müssen. Ein besserer Ansatz besteht.
Darüber hinaus tragen Variablen dazu bei, einen sauberen Makefile -Code zu erreichen, den jeder lesen und verstehen kann.
Lassen Sie uns ein Beispiel für die Verwendung der Variablen zum Erstellen von Dateien haben.
In der Makefile definieren wir eine Variable benannt Dateien Dies enthält zwei Werte für die Dateien, die wir beim Erstellen des Projekts erstellen:
In diesem Beispiel beziehen wir uns auf unser früheres Beispiel für die Erstellung des C -Programms. In diesem Fall fügen wir jedoch einige Variablen hinzu, die wir während des gesamten Programms ändern können.
Zunächst geben wir den Pfad an, den der Compiler verwenden sollte, um die Header -Dateien als aktuelles Verzeichnis zu suchen (.). Ein besserer Ansatz ist es, den Pfad als Variable anzugeben. Sie können die Variable angeben, die vom Compiler verwendet werden soll CFLAGs Spezielle Konstanten, die verwendet werden, um mit dem Compiler zu kommunizieren.
Cflags = -i.
Benutze die $ (CFLAGs) variabler Platzhalter anstelle des Pfades.
Trotzdem können wir den Typ -Compiler als Variable festlegen, sodass jemand, der einen anderen Compiler verwendet.
CC = GCC
Benutze die $ (CC) Variabler Platzhalter anstelle des Compilers. Hier ist das letzte Makefile mit den zusätzlichen Variablen:
Wenn wir den Befehl machen, erhalten wir die gleiche Ausgabe wie zuvor, nur dass unser Makefile -Code jetzt sauberer ist und wir alle Redundanzen beseitigt haben.
Beim Erstellen des Makefile können Sie ein Makro erstellen Obj Um die Voraussetzungen darzustellen, die erforderlich sind, um ein Ziel zu erstellen. Auf diese Weise können Sie die Objektdateien vom Makro schnell bearbeiten, ohne die andere Makefile zu manipulieren. Zum Beispiel können wir ein Makro -OBJ für unser Ziel haben, wie im Folgenden gezeigt:
Beachten Sie, dass wir die Voraussetzungen durch die Objektvariable ersetzen.
Abhängigkeiten abwickeln
Der "enthalten"Dateien hängen von der" ab ".C”Dateien im Projekt. Bei der Arbeit mit einem großen Projekt und Sie bearbeiten die “enthalten” Datei, "Make" wird das nicht neu kompilieren ".C”Dateien. Dieser Fehler bedeutet, dass Ihr Projekt nicht ordnungsgemäß neu kompiliert wird, es sei denn, wir machen den Makefile die vorhandenen Abhängigkeiten zwischen den “.C" Und ".H”Dateien.
In diesem Fall müssen wir die besondere Konstante verwenden DEPs Um ein Makro zu erstellen, um diese Abhängigkeiten zu bewältigen. Wir können die DEPs in der Regel darstellen, wie im Folgenden dargestellt:
Die vorherige Regel schafft zuerst a DEPs Makro, dessen Wert die Header -Datei in den Projektdateien ist. Als nächstes weist es an “machen"Das bevor es die" erzeugt ".Ö"Datei, sie muss zuerst die" kompilieren "kompilieren.CDatei mit dem angegebenen Compiler Datei. Als nächstes gibt das -c -Flag an, dass der Compiler eine Objektdatei erzeugt, während die -o $@ lehrt “machenUm die kompilierte Ausgabe links vom Dickdarm zu setzen.
Mit dieser Regel verarbeiten wir alle Abhängigkeiten so, dass wenn wir eine Datei ändern. “machen”Beherbergt es bei der Neukompilierung des Projekts.
Hinzufügen anderer Makefiles
Wenn Sie mit einem Makefile arbeiten, ist es möglich, die anderen Makefiles aufzunehmen. Auf diese Weise kann das aktuelle Makefile aus den enthaltenen Makefiles lesen, um die Zusammenstellung zu unterstützen.
Um andere Makefiles einzubeziehen, fügen Sie die hinzu enthalten Schlüsselwort, das anweist "machenUm das Lesen des aktuellen Makefile zu pausieren und die anderen enthaltenen Makefiles zu lesen.
Dateinamen einbeziehen
Sie können auch andere Dateitypen mit dem Schlüsselwort einschließen, vorausgesetzt, Sie fügen den Abstand zwischen den Dateinamen hinzu.
Lange Zeilen in Makefiles aufteilen
Obwohl "machen”Hat keine Grenze dafür, wie lange eine Aussage dauern kann, lange Sätze werden schnell unlesbar und sind schlechte Formatierungsstile. GNU “machen”Bietet die Aufteilung langer Sätze durch Hinzufügen des Backslash -Charakters auf.
OBJ = Mainfunc.C \
func1.C
In diesem Beispiel “machen”Liest die vorherige Zeile als OBJ = Mainfunc.C func1.C und ignoriere die Backslash.
In dem bereitgestellten Bild teilen wir die Rezeptlinie mit einem Backslash auf.
Nehmen wir an, Sie möchten ein Wort darstellen, ohne eine Whitespace hinzuzufügen. Ersetzen Sie den Rückgang durch ein Dollarschild, einen Backslash und eine neue Linie.
Hier ist ein Beispiel:
Wenn "machen”Liest die Makefile, es ignoriert zuerst den Backslash für eine neue Linie. Als nächstes liest es das Dollar -Zeichen als Raum, der eine Variable mit einem Zeichen darstellt.
Daher behandelt es schließlich Ihre geteilten Zeilen als ein Wort ohne Weißespace. Wenn wir benutzen “machen"Um das Makefile zu lesen, bekommen wir seitdem keinen Fehler"machen”Behandelt die geteilten Zeilen in der Variablen als ein Wort.
Reinigen eines Verzeichnisses
Sobald Sie ein Programm mit “kompilieren“ kompilieren “machen”, Möglicherweise müssen Sie unnötige Dateien reinigen, die als Ausgabe generiert werden. Obwohl das Erstellen eines sauberen Ziels möglich ist, ist dies nicht der empfohlene Ansatz, wie im Folgenden dargestellt:
Das vorherige Bild weist an "machen" So löschen Sie alle Textdateien und “.ÖErweiterungsdateien, die im aktuellen Verzeichnis erstellt werden.
Um die unerwarteten Situationen zu bewältigen, ist es am besten, eine genauere Regel zu erstellen und sicherzustellen, dass Sie sie nicht als Standardregel in der Makefile hinzufügen.
Verwenden Sie bei der Ausführung der sauberen Regel die “sauber machen" Befehl.
Abschluss
GNU „Make“ ist ein praktisches Werkzeug zum Aufbau und Verwalten kleiner und großer Projekte. Zu wissen, wie man es nutzt. Wir haben gelernt, wie man den GNU benutzt “machenEingehender und wie man mit einem Makefile arbeitet, einschließlich des Verständnisses, wie Make die Makefile liest. Hoffentlich hat dieser Leitfaden eine Grundlage für die Verbesserung Ihrer GNU im Umgang mit Ihren Projekten gelegt.