Wie übergibt man die Makrodefinition von “make”-Befehlszeilenargumenten (-D) an den C-Quellcode?
Lesezeit: 3 Minuten
Normalerweise übergebe ich Makrodefinitionen von “make command line” an ein “makefile” mit der Option: -Dname=value. Die Definition ist innerhalb des Makefiles zugänglich.
Ich übergebe auch Makrodefinitionen aus dem “Makefile” an den “Quellcode”, indem ich die ähnliche Compiler-Option verwende: -Dname=value (in vielen Compilern unterstützt). Diese Definition ist im Quellcode zugänglich.
Was ich jetzt brauche, ist, dem Benutzer meines Makefiles zu ermöglichen, beliebige Makrodefinitionen von der “make.exe-Befehlszeile” sofort an den “Quellcode” zu übergeben, ohne etwas im Makefile ändern zu müssen.
Der Benutzer kann also Folgendes eingeben: make -f mymakefile.mk -SOMEOPTION var=5
dann kann direkt der Code main.c var sehen:
int main()
{
int i = var;
}
ouah
Anruf make so befehlen:
make CFLAGS=-Dvar=42
Und unbedingt verwenden $(CFLAGS) in Ihrem Kompilierungsbefehl im Makefile. Wie @jørgensen erwähnte, setzen Sie die Variablenzuweisung nach der make Befehl überschreibt die CFLAGS value hat das Makefile bereits definiert.
Alternativ könnte man einstellen -Dvar=42 in einer anderen Variablen als CFLAGS und dann diese Variable wiederverwenden in CFLAGS um ein vollständiges Überschreiben zu vermeiden CFLAGS.
Sie können “CFLAGS = $(CFLAGS) -Wall” nicht verwenden; dies wäre eine rekursive Definition und make lässt dies nicht zu. Sie könnten “CFLAGS := $(CFLAGS) -Wall” oder “CFLAGS += -Wall” verwenden, aber auch diese funktionieren nicht, da eine Zuweisung auf der Befehlszeile eine höhere Priorität hat. Sie könnten “override CFLAGS += -Wall” verwenden, aber im Allgemeinen empfehlen wir, dass Sie intern einfach andere Variablen auswählen. Die GNU-Codierungsstandards erfordern, dass CFLAGS usw. für den Benutzer belassen werden, und Makefiles wählen eine andere Variable, wie “local_CFLAGS = $(CFLAGS) -Wall”.
– Verrückter Wissenschaftler
30. Januar 2012 um 5:36 Uhr
Nur um die Anmerkung von @MadScientist hinzuzufügen, die Die GNU-Codierungsstandards geben ebenfalls an das $(CFLAGS) sollte an letzter Stelle stehen, damit alle von einem Benutzer angegebenen Optionen alles überschreiben, was das Makefile intern festlegt. Das würde bedeuten, z local_CFLAGS = -Wall $(CFLAGS). Umgekehrt, wenn es etwas gibt, das Sie wirklich priorisieren möchten, stellen Sie es nach $(CFLAGS)wie im Kommentar von @MadScientist.
– Sam
9. Dezember 2016 um 18:01 Uhr
Wie setze ich damit mehrere Makros?
– Woody Huang
5. Dezember 2017 um 8:13 Uhr
@WoodyHuang zum Beispiel CFLAGS="-Dvar1=42 -Dvar2=314"
– au
5. Dezember 2017 um 21:18 Uhr
CPPFLAGS könnte eine bessere Passform darstellen als CFLAGS oder CXXFLAGS: stackoverflow.com/a/53527858/2278206
– Psq
28. Januar 2019 um 12:51 Uhr
Aufgrund des geringen Ansehens kann ich die akzeptierte Antwort nicht kommentieren.
Ich möchte die vordefinierte Variable erwähnen CPPFLAGS. Es könnte eine bessere Passform darstellen als CFLAGS oder CXXFLAGSda es durch die beschrieben wird GNU-Make Handbuch als:
Zusätzliche Flags für den C-Präprozessor und Programme, die ihn verwenden (die C- und Fortran-Compiler).
Beispiele für integrierte implizite Regeln, die verwenden CPPFLAGS
n.o wird automatisch aus gemacht n.c mit einem Rezept der Form:
$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o wird automatisch aus gemacht n.cc, n.cppoder n.C mit einem Rezept der Form:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Man würde den Befehl verwenden make CPPFLAGS=-Dvar=123 um das gewünschte Makro zu definieren.
Verwenden Sie dafür einfach eine bestimmte Variable.
$ cat Makefile
all:
echo foo | gcc $(USER_DEFINES) -E -xc -
$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc -
...
one
$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc -
...
bar
$ make
echo foo | gcc -E -xc -
...
foo
Anruf tätigen Dies Weg
make CFLAGS=-Dvar=42
weil Sie die CFLAGS Ihres Makefiles überschreiben möchten und nicht nur die Umgebung (die in Bezug auf Makefile-Variablen eine niedrigere Priorität hat).