我通常使用以下选项将宏定义从“make命令行”传递给“makefile”: -dname =值。该定义可在makefile中访问。
我还使用类似的编译器选项将宏定义从“makefile”传递到“源代码”: -Dname = value(许多编译器都支持)。可以在源代码中访问此定义。
我现在需要的是允许makefile的用户能够立即将“make.exe命令行”中的任意宏定义传递给“源代码”,而无需更改makefile中的任何内容。 / p>
所以用户可以输入: make -f mymakefile.mk -SOMEOPTION var = 5
然后直接代码main.c可以看到var:
int main()
{
int i = var;
}
答案 0 :(得分:86)
以这种方式调用make
命令:
make CFLAGS=-Dvar=42
并确保在Makefile中的编译命令中使用$(CFLAGS)
。正如@jørgensen所提到的,在make
命令之后放置变量赋值将覆盖已定义Makefile的CFLAGS
值。
或者,您可以在-Dvar=42
之外的另一个变量中设置CFLAGS
,然后在CFLAGS
中重复使用此变量,以避免完全覆盖CFLAGS
。
答案 1 :(得分:9)
调用make 此方式
make CFLAGS=-Dvar=42
因为你确实希望覆盖Makefile的CFLAGS,而不仅仅是环境(Makefile变量的优先级较低)。
答案 2 :(得分:8)
只需使用特定变量即可。
$ 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
答案 3 :(得分:3)
由于声誉低下,我无法评论已接受的答案。
我想提到预定义变量CPPFLAGS
。
它可能表示比CFLAGS
或CXXFLAGS
更好的拟合度,因为 GNU Make 手册将其描述为:
额外标志提供给C预处理程序和使用它的程序 (C和Fortran编译器)。
CPPFLAGS
的内置隐式规则的示例n.o
由n.c
自动制成,格式为:
$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
是由n.cc
,n.cpp
或n.C
自动制成的,格式为:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
一个人将使用命令make CPPFLAGS=-Dvar=123
来定义所需的宏。
答案 4 :(得分:1)
$ cat x.mak all: echo $(OPTION) $ make -f x.mak 'OPTION=-DPASSTOC=42' echo -DPASSTOC=42 -DPASSTOC=42
答案 5 :(得分:-3)
在下面找到C文件和Makefile实现以满足您的要求
foo.c的
main ()
{
int a = MAKE_DEFINE;
printf ("MAKE_DEFINE value:%d\n", a);
}
生成文件
all:
gcc -DMAKE_DEFINE=11 foo.c