[Linux] Projektautomatisierungs-Build-Tool - make/Makefile


1. Die Bedeutung von Make/Makefile

  • Ob Sie ein Makefile schreiben können, zeigt einerseits, ob eine Person die Fähigkeit hat, große Projekte abzuschließen
  • Die Quelldateien in einem Projekt werden nicht mitgezählt, und sie werden je nach Typ, Funktion und Modul in mehreren Verzeichnissen abgelegt.Das Makefile definiert eine Reihe von Regeln, um anzugeben, welche Dateien zuerst kompiliert werden müssen, welche Dateien später kompiliert werden müssen , und welche Dateien neu kompiliert werden müssen Kompilieren Sie und führen Sie sogar komplexere funktionale Operationen durch
  • Der Vorteil von Makefile ist - "automatische Kompilierung". Einmal geschrieben, wird nur ein make-Befehl benötigt, und das gesamte Projekt kann vollautomatisch kompiliert werden, was die Effizienz der Softwareentwicklung erheblich verbessert.
  • make ist ein Befehlstool, das die Anweisungen im Makefile erklärt.Im Allgemeinen haben die meisten IDEs (integrierte Entwicklungsumgebungen) diesen Befehl, wie zum Beispiel: make in Delphi, nmake in Visual C++, make in GNU unter Linux. Es ist ersichtlich, dass Makefiles zu einer Kompilierungsmethode in der Technik geworden sind.
  • make ist ein Befehl, makefile ist eine Datei (unter dem Pfad des aktuellen Quellcodes), und die beiden werden zusammen verwendet, um die automatische Konstruktion des Projekts abzuschließen.

2. Regeln und Nutzung

verwenden

Werfen wir zunächst einen Blick auf die einfache Verwendung von make/Makefile unter Linux (zuerst auf den Pigrun schauen und dann die Regeln analysieren):

erster Schritt: Wir erstellen zuerst eine myfile.c-Datei und schreiben einfachen Inhalt
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

zweiter Schritt: Erstellen Sie ein Makefile und schreiben Sie Inhalt, der den Makefile-Regeln entspricht
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

dritter Schritt: Verwenden Sie den Befehl make, um ein ausführbares Programm zu generieren, und verwenden Sie make clean, um das ausführbare Programm zu löschen
Bildbeschreibung hier einfügen

Regel

Makefile ist ein automatisiertes Kompilierungstool, das auf Abhängigkeiten und abhängigen Methoden basiert.

Bildbeschreibung hier einfügen

1. Abhängigkeitsbeziehung : In diesem Programm bilden das ausführbare Programm myfile und die Datei myfile.c eine Abhängigkeitsbeziehung, und die Änderung von myfile.c wirkt sich auf myfile aus, sodass myfile von myfile.c abhängt. Die erste Zeile bedeutet also , dass die Generierung des ausführbaren Programms myfile von der Datei myfile.c abhängt.

2. Abhängigkeitsverfahren : Die Erzeugung des ausführbaren Programms myfile hängt von myfile.c ab, und gcc myfile.c -o myfilees ist das Abhängigkeitsverfahren, bei dem die myfile-Datei von myfile.c abhängt.
( Hinweis: Um eine Sache abzuschließen, müssen Sie die richtige Abhängigkeit + die richtige Abhängigkeitsmethode haben. )

3. PHONY: Das durch dieses Schlüsselwort modifizierte Objekt ist ein Pseudo-Target, d. h. das Target kann immer ausgeführt werden (keine Notwendigkeit, die alte und die neue Zeit zu vergleichen), dh wenn wir dasselbe ausführbare Programm mehrfach erzeugen wollen Manchmal können wir dieses Schlüsselwort verwenden, um das Objekt zu modifizieren, aber wir tun dies im Allgemeinen nicht. Jeder wird sicherlich Fragen haben: "Hä? Was bedeutet es, immer hingerichtet zu werden?"

Nehmen wir dieses Makefile als Beispiel, und der Inhalt der Datei myfile.c bleibt unverändert.
Bildbeschreibung hier einfügen
Make-Prinzip : Dieser Code verkörpert vollständig die Abhängigkeitsbeziehung und die Abhängigkeitsmethode: make findet eine Datei namens "Makefile" oder "makefile" im aktuellen Verzeichnis und findet dann die erste Abhängigkeitsbeziehung, und die Generierung von myfile hängt von myfile ab. o , die Generierung von myfile.o hängt von myfile.s ab, die Generierung von myfile.s hängt von myfile.i ab, die Generierung von myfile.i hängt von myfile.c ab, und dann sind die Inhalte von gcc ihre abhängigen Methoden. Dann ist clean aufräumen.Wenn wir make clean auf der Kommandozeile eingeben, rm -f myfile myfile.i myfile.o myfile.swird dieser Befehl ausgeführt, und diese Dateien können direkt gelöscht werden. Dies ist die Abhängigkeit des gesamten make, und make findet die Abhängigkeiten der Dateien Schicht für Schicht, bis schließlich die erste Zieldatei kompiliert ist. Wenn während des Suchvorgangs ein Fehler auftritt, beispielsweise wenn die letzte abhängige Datei nicht gefunden werden kann, wird make direkt beendet und einen Fehler melden, und make wird den Fehler des definierten Befehls oder das Fehlschlagen der Kompilierung ignorieren. make kümmert sich nur um die Abhängigkeiten der Dateien, das heißt, wenn die Dateien nach dem Doppelpunkt immer noch nicht da sind, nachdem ich die Abhängigkeiten gefunden habe, dann tut es mir leid, ich werde nicht arbeiten.

Projektbereinigung : Projekte müssen bereinigt werden. Wenn es wie bei clean nicht direkt oder indirekt mit der ersten Zieldatei verknüpft ist, werden die dahinter definierten Befehle nicht automatisch ausgeführt, aber wir können esZur Ausführung anzeigen. Das heißt, der Befehl - "sauber machen", um alle Objektdateien für die Neukompilierung zu löschen . Aber im Allgemeinen setzen wir die saubere Zieldatei als Pseudo-Target und modifizieren sie mit .PHONY.Das Pseudo-Target hat die Eigenschaft, dass es immer ausgeführt wird.

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Dieser Code führt make zum ersten Mal aus und kann normal ausgeführt werden, aber wenn wir make zum zweiten Mal in die Befehlszeile eingeben, kann er nicht noch einmal ausgeführt werden. Wie Sie jedoch im obigen Bild sehen können, führen wir es erneut aus, nachdem make clean einmal ausgeführt wurde, um wirksam zu werden, und es wird immer noch wirksam. Das ist also die Rolle von .PHONY, was „immer ausgeführt“ bedeutet. Wenn Sie möchten, dass der make-Befehl immer ausgeführt wird, fügen Sie .PHONY am Anfang hinzu. Woher weiß gcc also, dass wir nicht erneut kompilieren müssen, ohne .PHONY hinzuzufügen?

Methode: Wenn wir die Quelldatei nach make ändern, können wir den make-Befehl erneut ausführen (das heißt, der Compiler beurteilt, ob die Änderungszeit von myfile.c früher als das ausführbare Programm von myfile ist, wenn sie später als myfile ist, es bedeutet, dass myfile Die .c-Datei geändert wird, make weiter ausgeführt werden kann, ein neues Programm generiert und das alte Programm überschreibt).

Hinweis : make ist ein Befehl, makefile ist eine Datei (unter dem Pfad des aktuellen Quellcodes), und die beiden werden zusammen verwendet, um die automatische Konstruktion des Projekts abzuschließen. Der Befehl make führt standardmäßig die erste abhängige Methode im Makefile aus. Wenn Sie das angegebene Programm ausführen möchten, müssen Sie die Definition anzeigen, z. B. das obige make clean.

Wenn wir beispielsweise das Makefile in den folgenden Code ändern und mit wq beenden und den make-Befehl in die Befehlszeile eingeben, wird der rm-Befehl zuerst ausgeführt.
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

3. Makefile kompiliert mehrere Dateien

Wie kompilieren wir, wenn unser Projekt mehrere Quelldateien enthält?
Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen
Zunächst einmal können wir gcc-Anweisungen direkt verwenden, um mehrere Quelldateien zu kompilieren, um ausführbare Programme zu generieren. Beachten Sie, dass beim Kompilieren von Dateien auf diese Weise keine Header-Datei hinzugefügt werden muss, da der Compiler den Namen der erforderlichen Header-Datei direkt durch den Inhalt der Quelldatei kennen kann.
Bildbeschreibung hier einfügen
Wenn Sie jedoch mehrere Dateien kompilieren, verwenden Sie im Allgemeinen gcc nicht direkt, um ein ausführbares Programm zu generieren, sondern verwenden Sie zuerst jede Quelldatei, um ihre eigene Binärdatei zu generieren, dh die .o-Datei, und verknüpfen Sie dann diese Binärdateien, um eine ausführbare Datei zu generieren Programm. Aber wenn die Anzahl der Quelldateien zunimmt, wird auch die Anweisungslänge zunehmen, also müssen wir das Projektautomatisierungs-Build-Tool make/Makefile verwenden, das die Effizienz der Kompilierung und des Betriebs erheblich verbessern kann.

Grund :

  1. Wenn die Quelldatei direkt zum Generieren eines ausführbaren Programms verwendet wird, müssen wir, wenn eine .c-Datei geändert wird, alle vorherigen Quelldateien neu kompilieren und verknüpfen, um eine ausführbare Datei zu generieren.
  2. Wenn jede Quelldatei zuerst ihre eigene .o-Objektdatei erzeugt und dann eine Quelldatei geändert wird, müssen wir nur die Binärdatei der Quelldatei neu kompilieren und dann alle Binärdateien verknüpfen. Dies verbessert die Effizienz der Programmkompilierung und -operation erheblich.

Schritt 1 : Erstellen Sie eine Datei mit dem Namen Makefile/makefile in dem Verzeichnis, in dem sich die Quelldatei befindet.
Schritt 2 : Makefile schreiben.
Bildbeschreibung hier einfügen
Ausführungsergebnis :
Bildbeschreibung hier einfügen

Ergänzung: Shortcut-Methode zum Schreiben von Makefile

  1. $@: Gibt die Objektdatei in der Abhängigkeit an (links vom Doppelpunkt).
  2. $^: Zeigt die Liste der abhängigen Dateien in Abhängigkeiten an (rechts vom Doppelpunkt).
  3. $<: Gibt die erste abhängige Datei in den Abhängigkeiten an (die erste rechts vom Doppelpunkt).

Die obige Datei kann also auch geschrieben werden als:
Bildbeschreibung hier einfügen

おすすめ

転載: blog.csdn.net/weixin_63449996/article/details/130018588