Das wiederholte Eintippen langer „gcc“-Befehle ist schmerzhaft. Es wird noch schlimmer, wenn Sie ständig Bibliotheken hinzufügen oder Code optimieren. Makefiles beheben dieses Problem. Sie automatisieren den Erstellungsprozess, sodass Sie nicht mehr immer dieselben Befehle eingeben müssen.
Hier ist ein einfaches Makefile-Beispiel. Es ersetzt eine manuelle Kompilierungssequenz.
„makefile
main: main.o util.o
gcc -o main main.o util.o
main.o: main.c util.h
gcc -c -g main.c
util.o: util.c util.h
gcc -c -g util.c
„
Speichern Sie dies in einer Datei mit dem Namen makefile. Führen Sie „make“ aus, um die ausführbare Datei zu erstellen. Es gibt eine strenge Regel. Sie müssen vor jeder „gcc“-Zeile ein Tabulatorzeichen verwenden. Acht Leerzeichen schlagen fehl. Das Build-Tool wird es ablehnen. Alle anderen Zeilen müssen am linken Rand beginnen.
Abhängigkeiten verstehen
Ein Makefile hat zwei Arten von Zeilen. Linksbündige Linien sind Abhängigkeitslinien. Sie definieren Beziehungen zwischen Dateien. Tabulatorzeilen sind ausführbare Befehle. Dies können alle gültigen UNIX-Befehle sein.
Nehmen Sie diese Zeile:
main.o: main.c util.h
Hier steht, dass „main.o“ von „main.c“ und „util.h“ abhängt. Wenn sich eine der Quelldateien ändert, wird der darunter liegende Befehl ausgeführt. Es erstellt „main.o“ neu.
Die erste Zeile in der Datei ist etwas Besonderes. Es definiert das endgültige Ziel. In diesem Fall handelt es sich um die „hauptsächliche“ ausführbare Datei. Es listet „main.o“ und „util.o“ als Abhängigkeiten auf. Wenn diese Objektdateien neuer als die Quelle sind, erstellt Make sie neu. Dann verknüpft es sie mit der endgültigen Binärdatei.
„Bash
gcc -o main main.o util.o
„
Dieser Befehl wird nur ausgeführt, wenn sich die Abhängigkeiten ändern. Wenn sich nichts geändert hat, unternimmt Make nichts. Das ist der Kernvorteil. Es überspringt bereits erledigte Arbeiten.
Warum dies für Ihren Workflow wichtig ist
Große Programme verfügen über viele Bibliotheken und Quelldateien. Die Nachverfolgung, welche Dateien manuell geändert wurden, ist fehleranfällig. Ein Makefile erledigt dies automatisch. Es wird nur das neu kompiliert, was notwendig ist. Sie ändern eine Header-Datei. Make erstellt jede Quelldatei, die es enthält, neu. Sie ändern eine Dienstprogrammfunktion. Make erstellt nur diese Objektdatei neu und verknüpft die ausführbare Datei erneut.
Sie müssen sich nicht auf einem UNIX-System befinden, um diese Logik verwenden zu können. Die meisten modernen Compiler und IDEs verfügen über ähnliche Funktionen. Überprüfen Sie die Dokumentation Ihres Compilers. Suchen Sie nach Build-Automatisierungstools. Unter der Haube funktionieren sie auf die gleiche Weise.
Das bringt uns zurück zu Headern wie „stdio.h“. Sie haben sie in frühere Beispiele eingefügt, ohne zu erklären, warum. Es handelt sich um Standardbibliotheken. Jemand hat sie vor Jahren geschrieben. Sie haben sie zur Verfügung gestellt, um Ihnen die Neuerfindung grundlegender Funktionen zu ersparen. Makefiles und Standardbibliotheken sind Teil derselben Philosophie. Sie ermöglichen es Ihnen, sich auf die Logik zu konzentrieren, statt auf das Boilerplate.
Das Werkzeug ist nur so gut wie seine Regeln. Wenn Ihre Abhängigkeiten falsch sind, kann Make nicht das wiederherstellen, was es sollte. Oder noch schlimmer: Es wird veralteter Code erstellt. Überprüfen Sie Ihre Tabulatorzeichen. Überprüfen Sie Ihre Dateinamen. Machen Sie die Syntax richtig und der Compiler erledigt die schwere Arbeit.
Sie fragen sich vielleicht, ob die manuelle Kompilierung jemals schneller ist. Für eine einzelne Datei vielleicht. Aber sobald Sie eine Kopfzeile in einem Projekt mit mehreren Dateien berühren, verliert die manuelle Methode ihre Gültigkeit. Sie beginnen mit dem Kopieren von Befehlen. Sie fangen an, Tippfehler zu machen. Sie fragen sich, warum „main.o“ nicht aktualisiert wurde.
Der eigentliche Gewinn liegt in der Verlagerung von der Eingabe von Befehlen hin zur Definition von Regeln. Sie definieren den Zustand. Das Tool erzwingt die Übergänge. Es ist eine kleine Änderung der Gewohnheit. Es zahlt sich bei jedem weiteren Aufbau aus.


























