如何将“make”命令行参数(-D)的macros定义传递给C源代码?

我通常使用以下选项将“make command line”的macros定义传递给“makefile”:-Dname = value。 该定义可以在makefile中进行访问。

我也使用类似的编译器选项将“makefile”的macros定义传递给“源代码”:-Dname = value(在许多编译器中支持)。 这个定义可以在源代码中find。

我现在需要的是允许我的makefile的用户能够将任意macros定义从“make.exe命令行”立即传递到“源代码”,而不必在makefile中更改任何内容。

所以用户可以键入:make -f mymakefile.mk -SOMEOPTION var = 5

那么直接代码main.c就可以看到var:

int main() { int i = var; } 

make这种方式调用make命令:

 make CFLAGS=-Dvar=42 

并且一定要在Makefile的编译命令中使用$(CFLAGS) 。 正如@jørgensen所提到的,在make命令之后放置variables赋值将覆盖已经定义了Makefile的CFLAGS值。

或者,你可以在另一个variables中设置-Dvar=42而不是CFLAGS ,然后在CFLAGS重用这个variables来避免完全覆盖CFLAGS

只要使用一个特定的variables。

 $ 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 

通过这种方式打电话

 make CFLAGS=-Dvar=42 

因为你确实想要覆盖你的Makefile的CFLAGS,而不仅仅是环境(与Makefilevariables相比具有较低的优先级)。

 $ cat x.mak
所有:
     echo $(OPTION)
 $ make -f x.mak'OPTION = -DPASSTOC = 42'
 echo -DPASSTOC = 42
 -DPASSTOC = 42

在下面findC文件和Makefile实现来满足你的要求

foo.c的

  main () { int a = MAKE_DEFINE; printf ("MAKE_DEFINE value:%d\n", a); } 

Makefile文件

 all: gcc -DMAKE_DEFINE=11 foo.c