Makefile

Die Übersichtlichkeit der Seite wird durch Javascript erhöht. Ist dies aktiviert, werden die Texte unter den Überschriften durch Anklicken der Überschriften ein- und ausgeblendet.

Nutzen

Ein Makefile ist eine simple Textdatei mit dem Namen Makefile. Darin werden Befehle zur Erstellung eines Programmes definiert, die durch die Ausführung von make auf der Konsole in dem Verzeichnis in dem sich das Makefile befindet ausgeführt werden. Damit ist es möglich die für die Erstellung eines Programmes notwendigen Befehle nur einmal zu definieren und dann durch einfaches ausführen von make auszuführen. Das Besondere dabei ist, dass make nur die Befehle ausführt bei denen sich die im Makefile definierten Abhängigkeiten zur Erstellung des Ziels geändert haben. Gab es seit der letzten Ausführung keine Änderungen, so teilt make dies einfach mit und führt ansonnsten keine Operationen durch. Dies ist gerade bei komplexeren Programmen von Vorteil, da dadurch nur immer die Teile neu erstellt werden, bei denen es Änderungen gab. Das spart viel Zeit. Über Variablen kann die schreibweise der Befehle des Makefiles verkürzt werden.

nach oben

Beispiele

Beispiel 1

# -*- Makefile -*-
C=g++
CF=-c -std=c++14 -Wall
OBJ=grafik.o\
    main.o\
    rechteck.o\
    quadrat.o

HD=grafik.h\
   rechteck.h\
   quadrat.h

all: erbe

erbe: $(OBJ)
	$(C) $^ -o $@
	
grafik.o: grafik.h grafik.cpp
	$(C) $(CF) grafik.cpp -o $@
rechteck.o: rechteck.h rechteck.cpp
	$(C) $(CF) rechteck.cpp -o $@
quadrat.o: quadrat.h quadrat.cpp
	$(C) $(CF) quadrat.cpp -o $@

main.o: $(HD) erbe-main.cpp
	$(C) $(CF) erbe-main.cpp -o $@

clean:
	$(RM) $(OBJ) erbe

nach oben

Beispiel 2

# -*- Makefile -*
C=g++
CF=-c -std=c++14 -Wall
HD=grafik.h\
   rechteck.h\
   quadrat.h
SRC=erbe-main.cpp\
    grafik.cpp\
    rechteck.cpp\
    quadrat.cpp
OBJ=$(SRC:.cpp=.o)

all: erbe

erbe: $(OBJ)
   $(C) $^ -o $@

%.o: %.cpp $(HD)
   $(C) $(CF) $< -o $@

clean:
   $(RM) $(OBJ) erbe

nach oben

Erklärung

C=g++
definiert eine Variable C mit dem Namen des Kompilers g++
$(C)
verwendet die Variable, ist also im dem Beispiel gleichbedeutend als stünde an der Stelle g++
CF=-c -std=c++14 -Wall
definiert die Variable CF mit den Optionen für g++ die dafür sorgen das durch -c nur kompiliert wird und somit eine Objektdatei entsteht, durch -std=c++14 wird der C++14-Standard bei der Kompilation verwendet und durch -Wall werden die Warnungen bei der Kompilierung aktiviert. In der Folge braucht statt dieser Optionen nur noch $(CF) geschrieben werden.
Zeilenumbruch
Backslasch+Zeilenumbruch also \ENTER
$^
steht für alle Abhängigkeiten
$@
steht für das Ziel als Namen
$<
steht für die erste Abhängigkeit in Beispiel2 also für die jeweilige .cpp-Datei zur Erstellung der .o-Datei
%.o: %.cpp
definiert alle Ziele die mit .o enden mit einer Abhängigkeit von einer gleichnamigen Datei die auf .cpp endet. Damit lassen sich die ganzen .o-Ziele aus Beispiel1 wie in Beispiel2 gezeigt in einer Definition zusammenfassen.
$(SRC:.cpp=.o)
nimmt alle in der Variable SRC mit .cpp endenden Namen mit der Endung .o

nach oben