MakefileEine Projektdatei kann viele Quelldateien enthalten und verschiedene Funktionen und Module befinden sich in unterschiedlichen Verzeichnissen. Die herkömmliche Kompilierung kann solche Probleme nicht mehr effizient bewältigen. Um dieses Problem zu lösen, wird Makefile verwendet. Sobald das Makefile geschrieben ist, wird nur ein Make -Befehl benötigt, um alle in der Makefile-Datei geschriebenen Anweisungen auszuführen und so die gesamte Projektdatei zu kompilieren, was die Effizienz erheblich verbessert . make ist ein Befehlstool zum Interpretieren der Befehle im Makefile. Makefile-Benennung und RegelnDateibenennung Es kann entweder Makefile oder Makefile verwendet werden. Makefile-Regeln Die Befehlsregeln im Makefile lauten wie folgt: xxx (Zieldatei): xxx (abhängige Datei) Beachten Sie, dass vor dem Befehl ein Tabulatoreinzug stehen muss. Zum Beispiel: #Makefile app: ac bc #Ziel: Hängt von gcc ab ac bc -o app #Beachten Sie die Einrückung am Anfang dieser Zeile Nach dem Erstellen des obigen Makefile werden ac und bc im Verzeichnis in die Zieldatei app kompiliert. Wie Makefiles funktionierenVor der Ausführung der Befehle im Makefile wird geprüft, ob die erforderlichen Abhängigkeitsdateien vorhanden sind. Wenn es existiert : Führen Sie den Befehl aus Wenn es nicht existiert : Überprüfen Sie andere Regeln, um festzustellen, ob es andere Regeln gibt, die die von der aktuellen Regel geforderten Abhängigkeiten erzeugen. Wenn ja, führen Sie die Befehle in der Regel aus. Zum Beispiel: #Makefile App: Ao Bo gcc ao bo -o app ao: ac gcc -c ac -o ao bo: bc gcc -c bc -o bo Wenn im obigen Makefile die App-Regel ausgeführt wird, wird festgestellt, dass die erforderlichen abhängigen Dateien ao und bo im aktuellen Verzeichnis nicht vorhanden sind. Daher wird nach unten geschaut, ob es andere Regeln zum Generieren dieser Datei gibt. Wenn die Regel ao gefunden wird, stellt sich heraus, dass es sich um die erforderliche Datei handelt. Daher wird gcc -c ac -o ao ausgeführt, und dasselbe gilt für bo. Beim Ausführen der Befehle in den Regeln vergleicht Makefile die Änderungszeit der Zieldatei und der abhängigen Datei .<br /> Wenn die abhängige Datei neuer ist als die Zieldatei, d. h. wenn die abhängige Datei nach der letzten Zielgenerierung geändert wurde , wird die Zieldatei neu generiert. Wenn wir diese Funktion nutzen, können wir Abhängigkeiten und Ziele schrittweise generieren, also das zweite Makefile oben. Auf diese Weise führt make, wenn wir nur die ac-Datei ändern, nur die ao-Regeln und die app-Regeln erneut aus. Die bo-Regel wird nicht ausgeführt, da bc nicht geändert wurde. Dies kann die Ressourcenverschwendung erheblich reduzieren. Makefile-VariablenObwohl durch das Obige die Duplizierung des kompilierten Codes reduziert werden kann, wird das Schreiben eines Makefiles sehr viel Zeit verschwenden, wenn ein Projekt 1.000 .c .h-Dateien enthält. Daher müssen wir einige Variablen berücksichtigen, um die Effizienz zu verbessern. Variablen abrufen <br /> Wir verwenden $(Variablenname), um Variablen zu verwenden. Benutzerdefinierte Variablen <br /> Wir verwenden Variablenname = Variablenwert, z. B. var = hallo, um die benötigten Variablen anzupassen. #Makefile rsc = ac bc app: $(rsc) #Ziel: Hängt von gcc ab $(rsc) -o app #Beachten Sie die Einrückung am Anfang dieser Zeile Vordefinierte Variablen <br /> Einige Variablen sind vom System vordefiniert und wir können sie direkt verwenden. #Makefile rcs = ao bo App: $(rcs) $(CC) $(rcs) -o $@ %.o: %.c #Die obige Regel führt diese Regel zweimal aus $(CC) -c $< -o $@ Makefile-FunktionenWir können sehen, dass das obige Makefile relativ einfach ist, aber es löst immer noch nicht das Problem der vielen Dateien im Projekt. Um rcs zu erhalten, müssen wir immer noch jede Datei eingeben, die kompiliert werden muss. Dann müssen wir Funktionen verwenden, um diese abhängigen Dateien für uns zu schreiben. $(Platzhalter MUSTER. . .) Zum Beispiel: $(wildcard ./*.c) gibt alle Dateien mit der Endung c im aktuellen Verzeichnis zurück. $(patsubst Muster, Ersetzung, Text) Zum Beispiel: $(patsubst %.c, %.o, ac, bc) gibt ao, bo zurück. Auf diese Weise kann unser obiges Beispiel wie folgt umgeschrieben werden: #Makefile rcs = $(Platzhalter ./*.c) objs = (patsubst %.c, %.o, $(src)) App: $(Objekte) $(CC) $(Objs) -o $@ %.o: %.c #Die obige Regel führt diese Regel zweimal aus $(CC) -c $< -o $@ Regel zum Bereinigen von MakefilesNachdem wir den Befehl make ausgeführt haben, stellen wir fest, dass sich im aktuellen Verzeichnis viele Dateien mit der Endung o befinden, wir jedoch nur die endgültige Zieldatei app benötigen und die anderen redundant sind. Wie sollen wir damit umgehen? Die saubere Regel wird uns helfen, mit ihnen umzugehen. sauber Wir müssen nur die Bereinigungsregel am Ende des Makefiles hinzufügen, und die Befehle in der Bereinigungsregel können nach Abschluss jeder Kompilierung ausgeführt werden. wie: #Makefile rcs = $(Platzhalter ./*.c) objs = (patsubst %.c, %.o, $(src)) App: $(Objekte) $(CC) $(Objs) -o $@ %.o: %.c #Die obige Regel führt diese Regel zweimal aus $(CC) -c $< -o $@ sauber: rm $(objs) -f #rm Befehl löschen -f iteratives Löschen Sie werden jedoch feststellen, dass sich im aktuellen Verzeichnis eine zusätzliche saubere Zieldatei befindet. Die Makefile-Strategie wird weiterhin verwendet. Durch Vergleichen der Änderungszeit führen wir Clean oft rechtzeitig aus, können die Datei aber trotzdem nicht löschen. Dann benötigen wir die nächste Operation. Wir definieren clean als Pseudoziel, also .PHONY:clean, dann wird die Zieldatei nicht generiert, es findet kein Vergleich statt und es wird jedes Mal ausgeführt. Zum Beispiel: #Makefile rcs = $(Platzhalter ./*.c) objs = (patsubst %.c, %.o, $(src)) App: $(Objekte) $(CC) $(Objs) -o $@ %.o: %.c #Die obige Regel führt diese Regel zweimal aus $(CC) -c $< -o $@ .PHONY: sauber #Pseudoziel sauber: rm $(objs) -f #rm Befehl löschen -f iteratives Löschen Dies ist das Ende dieses Artikels über das Schreiben und Verwenden von Makefile unter Linux. Weitere relevante Inhalte zum Schreiben und Verwenden von Linux-Makefiles finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Bootstrap 3.0 - Schaltflächenstil für Lernnotizen
Dieser Artikel beschreibt anhand von Beispielen d...
Informationen finden Einige im Internet gefundene...
Gängige Methoden zur Begrenzung der Eingabe 1. Um ...
Inhaltsverzeichnis Docker-System df Docker-System...
Inhaltsverzeichnis 1. Was ist eine Unterabfrage? ...
Inhaltsverzeichnis VARCHAR- und CHAR-Typen Abschl...
Beim Starten von MongoDB lautet die Eingabeauffor...
Ausführen des Skripts im Debugmodus Sie können da...
1. Ziel: Ändern Sie den Wert des character_set_se...
Inhaltsverzeichnis Vorwort Architektur auf einen ...
Referenz: MySQL-Zeichensatzübersicht utf8mb4 wurd...
Inhaltsverzeichnis 1 Einleitung 2 Voraussetzungen...
Ergebnisse erzielen Code html <div Klasse=&quo...
Inhaltsverzeichnis 1. Vue2-Syntax 2. Nutzung von ...
Vorwort Als ich kürzlich ein Projekt erstellte, d...