Make-Datei

Eine Make-Datei ist eine Textdatei, auf die von dem Make-Befehl verwiesen wird, der den Aufbau der Ziele beschreibt; sie enthält Informationen wie zum Beispiel Abhängigkeiten auf Quellenebene und Abhängigkeiten der Erstellungsreihenfolge.

Das CDT kann eine Make-Datei für Sie generieren; solche Projekte werden verwaltete Make-Projekte genannt. In Projekten mit der Bezeichnung "Make-Standardprojekt" können Sie auch eine eigene Make-Datei definieren.

Beispiel-Make-Datei

# A sample Makefile
# This Makefile demonstrates and explains 
# Make Macros, Macro Expansions,
# Rules, Targets, Dependencies, Commands, Goals
# Artificial Targets, Pattern Rule, Dependency Rule.

# Comments start with a # and go to the end of the line.

# Here is a simple Make Macro.
LINK_TARGET = test_me.exe

# Here is a Make Macro that uses the backslash to extend to multiple lines.
# This allows quick modification of more object files.
OBJS =  \
 Test1.o \
 Test2.o \
 Main.o

# Here is a Make Macro defined by two Macro Expansions.
# A Macro Expansion may be treated as a textual replacement of the Make Macro.
# Macro Expansions are introduced with $ and enclosed in (parentheses).
REBUILDABLES = $(OBJS) $(LINK_TARGET)

# Make Macros do not need to be defined before their Macro Expansions,
# but they normally should be defined before they appear in any Rules.
# Consequently Make Macros often appear first in a Makefile.

# Here is a simple Rule (used for "cleaning" your build environment).
# It has a Target named "clean" (left of the colon ":" on the first line),
# no Dependencies (right of the colon),
# and two Commands (indented by tabs on the lines that follow).
# The space before the colon is not required but added here for clarity.
clean: 
 rm -f $(REBUILDABLES)
 echo Clean done

# There are two standard Targets your Makefile should probably have:
# "all" and "clean", because they are often command-line Goals.
# Also, these are both typically Artificial Targets, because they don't typically
# correspond to real files named "all" or "clean".  

# The rule for "all" is used to incrementally build your system.
# It does this by expressing a dependency on the results of that system,
# which in turn have their own rules and dependencies.
all : $(LINK_TARGET)
 echo All done

# There is no required order to the list of rules as they appear in the Makefile.
# Make will build its own dependency tree and only execute each rule only once
# its dependencies' rules have been executed successfully.

# Here is a Rule that uses some built-in Make Macros in its command:
# $@ expands to the rule's target, in this case "test_me.exe".
# $^ expands to the rule's dependencies, in this case the three files
# main.o, test1.o, and  test2.o.
$(LINK_TARGET) : $(OBJS)
 g++ -g -o $@ $^

# Here is a Pattern Rule, often used for compile-line.
# It says how to create a file with a .o suffix, given a file with a .cpp suffix.
# The rule's command uses some built-in Make Macros:
# $@ for the pattern-matched target
# $lt; for the pattern-matched dependency
%.o : %.cpp
 g++ -g -o $@ -c $<

# These are Dependency Rules, which are rules without any command.
# Dependency Rules indicate that if any file to the right of the colon changes,
# the target to the left of the colon should be considered out-of-date.
# The commands for making an out-of-date target up-to-date may be found elsewhere
# (in this case, by the Pattern Rule above).
# Dependency Rules are often used to capture header file dependencies.
Main.o : Main.h Test1.h Test2.h
Test1.o : Test1.h Test2.h
Test2.o : Test2.h

# Alternatively to manually capturing dependencies, several automated
# dependency generators exist.  Here is one possibility (commented out)...
# %.dep : %.cpp
#        g++ -M $(FLAGS) $< > $@
# include $(OBJS:.o=.dep)

Häufig gestellte Fragen:

In der Sicht 'Konsole' finden Sie nützliche Hinweise zum Beheben von Fehlern in einer Erstellung.

F1. In der Sicht 'Konsole' wird die Nachricht "Error launching builder" angezeigt. Was bedeutet diese Nachricht?

Error launching builder (make -k clean all )
(Exec error:Launching failed)

Der Erstellungsbefehl (standardmäßig "make") ist wahrscheinlich nicht im Pfad enthalten. Sie können ihn in den Pfad einfügen und Eclipse erneut starten.
Sie können auch den Erstellungsbefehl so ändern, dass daraus Ihr Pfad wird. Wenn Sie MinGW-Tools zum Kompilieren verwenden, müssen Sie den Erstellungsbefehl durch "mingw32-make" ersetzen.

F2. In der Sicht 'Konsole' wird die Nachricht "No rule to make target 'X'" angezeigt.

make -k clean all
make: *** No rule to make target 'clean'.
make: *** No rule to make target 'all'.

Das Erstellungsprogramm sucht standardmäßig nach einer Datei, die meistens "Makefile" oder "makefile" genannt wird. Wenn es eine solche Datei nicht im Arbeitsverzeichnis findet oder wenn diese Datei leer ist oder die Datei keine Regeln für die Befehlszeilenziele (in diesem Fall "clean" und "all") enthält, schlägt diese Suche in der Regel fehl und eine Fehlernachricht mit ungefähr dem Inhalt der obigen Nachrichten wird angezeigt.

Wenn Sie bereits über eine gültige Make-Datei verfügen, müssen Sie das Arbeitsverzeichnis für die Erstellung ändern. Das Standardarbeitsverzeichnis für den Erstellungsbefehl ist das Projektstammverzeichnis. Sie können dies durch Angeben eines anderen Erstellungsverzeichnisses in den Eigenschaften für Make-Projekte ändern. Wenn Ihre Make-Datei einen anderen Namen besitzt (zum Beispiel buildFile.mk), können Sie diesen Namen durch Angeben von make -f buildFile.mk als Standarderstellungsbefehl festlegen.

Wenn Sie nicht über eine gültige Make-Datei verfügen, erstellen Sie eine neue Datei mit dem Namen 'Makefile' im Stammverzeichnis. Anschließend können Sie den Inhalt der Beispiel-Make-Datei (oben) hinzufügen und diesen nach Bedarf anpassen.

F3. In der Sicht 'Konsole' wird die Nachricht "missing separator" angezeigt.

make -k clean all 
makefile:12: *** missing separator.  Stop.

Die Standardsyntax für Make-Dateien gibt vor, dass am Anfang jeder Zeile in einer Erstellungsregel ein Tabulatorzeichen stehen muss. Dieses Tabulatorzeichen wird oft unbeabsichtigt durch Leerzeichen ersetzt, und weil beides als Einrückung aus Leerzeichen dargestellt wird, wird dieser Fehler oft übersehen. Im angeführten Beispiel kann der Fehler anhand der Fehlernachricht in Zeile 12 der Datei "makefile" lokalisiert werden; fügen Sie zum Beheben des Fehlers ein Tabulatorzeichen am Anfang dieser Zeile ein.

F4. In der Sicht 'Konsole' wird die Nachricht "Target 'all' not remade because of errors" angezeigt.

make -k clean all 
make: *** [clean] Error 255
rm -f Test1.o Test2.o Main.o test_me.exe
g++ -g -o Test1.o -c Test1.cpp
make: *** [Test1.o] Error 255
make: *** [Test2.o] Error 255
make: *** [Main.o] Error 255
g++ -g -o Test2.o -c Test2.cpp
g++ -g -o Main.o -c Main.cpp
make: Target 'all' not remade because of errors.

Der Grund für diese Fehlernachricht ist das Fehlen von 'g++' im Pfad.

Fehler 255 wird vom Erstellungsprogramm ausgegeben, wenn die Befehlsshell nicht den Befehl für eine bestimmte Regel findet.
Nachrichten aus dem Standardfehlerstrom (die Zeilen mit 'Fehler 255') und aus dem Standardausgabestrom (alle anderen Zeilen) werden hier in der Sicht 'Konsole' zusammengeführt.

F5. Was bedeutet die Markierung -k?

Die Markierung -k signalisiert Make, dass die Erstellung anderer unabhängiger Regeln auch dann fortgesetzt werden soll, wenn eine Regel fehlschlägt. Dies ist beim Erstellen großer Projekte sinnvoll.

Sie können die Markierung -k entfernen, indem Sie die Option Projekteigenschaften > C/C++-Make-Projekt > Make-Erstellungsprogramm > Beim ersten Erstellungsfehler stoppen aktivieren.

F6. In der Sicht 'Konsole' wird Folgendes angezeigt:

mingw32-make clean all 
process_begin: CreateProcess((null), rm -f Test1.o Test2.o Main.o test_me.exe, ...) failed.
make (e=2): The system cannot find the file specified.

mingw32-make: *** [clean] Error 2
rm -f Test1.o Test2.o Main.o test_me.exe

Das bedeutet, dass mingw32-make nicht das Dienstprogramm "rm" finden konnte. Leider wird MinGW nicht mit "rm" ausgeliefert. Ersetzen Sie zur Korrektur die Bereinigungsregel in Ihrer Make-Datei durch Folgendes:

clean: 
	-del $(REBUILDABLES)
	echo Clean done

Das führende Minuszeichen signalisiert Make, dass die Bereinigungsregel auch dann als erfolgreich anzusehen ist, wenn der Löschbefehl nicht erfolgreich war. Dies kann zulässig sein, wenn der Löschbefehl fehlschlägt, weil die für die Löschung angegebenen Dateien nicht (oder nicht mehr) vorhanden sind.

IBM Copyrightvermerk