如何将“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