Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 4 SP2
Muss es im Makefile
LDFLAGS := -fPIC
oder
LDFLAGS = -fPIC
heißen?
Hab noch nie verstanden für was der Doppelpunkt steht^^
[m]info make | less -p ‘Variable Assignment’[/m]
Eigentlich solltest du [m]LDFLAGS := -fPIC $(LDFLAGS)[/m] verwenden, damit der Nutzer das Flag überschreiben kann.
Variablen, die mit [m]=[/m] deklariert werden, werden möglichst spät expandiert (erst bei der Verwendung der Variable)
Diese Variablen können z.B. [m]$@[/m] im Ersetzungstext enthalten.
Variablen mit [m]:=[/m] werden so früh wie möglich expandiert, also schon bei der Deklaration.
Das ist z.B. hilfreich, wenn man Quelldateien per [m]find[/m] sucht, da dann das Dateisystem nur einmal durchsucht wird:
SOURCE := $(shell find . -name "*.c")
Im Fall von [m]-fPIC[/m] ist das egal.
Siehe auch: Flavors (GNU make)
EDIT:
Dafür bietet sich die Zuweisung mit [m]+=[/m] an, denn das [m]:=[/m] kann unter Umständen kaputt gehen. Also so:
LDFLAGS += -fPIC
[m]+=[/m] erlaubt aber nicht, Flags der Anwendung zu überschreiben, was manchmal ganz praktisch ist.
Wann würde [m]:=[/m] kaputt gehen?
Immer dann, wenn der Ersetzungstext einer Variable Target-abhängige Variablen enthalten, z.B. [m]@[/m], [m][1], [m]$<[/m] etc. Wenn man z.B. ein eigenes Linker-skript pro Binary benötigt (zugegebenermaßen ein konstruiertes Beispiel), kann man das wie folgt lösen:
LDFLAGS = -T $(@:%=%.ld)
In der Realität verwendet man Target-abhängige Variablen z.B. beim generieren von Abhängigkeiten:
DEPGEN = -MM >$@ -MT "$@ $(@:%.d=%.o)" -MG -MP
Dann darf die Variable [m]DEPGEN[/m] auf keinen Fall mit [m]:=[/m] verwendet werden.
/m ↩︎