[英]How to pass macro definition from “make” command line arguments (-D) to C source code?
我通常使用选项:-Dname = value将宏定义从“make命令行”传递给“makefile”。 该定义可在makefile中访问。
我还使用类似的编译器选项将宏定义从“makefile”传递到“源代码”:-Dname = value(在许多编译器中都支持)。 可以在源代码中访问此定义。
我现在需要的是允许我的makefile用户能够立即将“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
命令之后放置变量赋值将覆盖已定义Makefile的CFLAGS
值。
或者,您可以在另一个变量中设置-Dvar=42
而不是CFLAGS
,然后在CFLAGS
重用此变量以避免完全覆盖CFLAGS
。
只需使用一个特定的变量。
$ 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,而不仅仅是环境(关于Makefile变量的优先级较低)。
由于声誉低,我不能评论接受的答案。
我想提一下预定义变量CPPFLAGS
。 它可能比CFLAGS
或CXXFLAGS
更合适,因为它被GNU Make手册描述为:
提供给C预处理器和使用它的程序的额外标志(C和Fortran编译器)。
CPPFLAGS
的内置隐式规则的示例 no
从自动进行nc
与以下形式的配方:
$(CC) $(CPPFLAGS) $(CFLAGS) -c
no
从自动进行n.cc
, n.cpp
,或nC
与以下形式的配方:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
可以使用命令make CPPFLAGS=-Dvar=123
来定义所需的宏。
$ cat x.mak all: echo $(OPTION) $ make -f x.mak 'OPTION=-DPASSTOC=42' echo -DPASSTOC=42 -DPASSTOC=42
在下面找到C文件和Makefile实现以满足您的要求
foo.c的
main ()
{
int a = MAKE_DEFINE;
printf ("MAKE_DEFINE value:%d\n", a);
}
Makefile文件
all:
gcc -DMAKE_DEFINE=11 foo.c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.