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

我通常使用以下选项将宏定义从“ make 命令行”传递到“ makefile”: - Dname = value.

我还使用类似的编译器选项将宏定义从“ makefile”传递到“ source code”: - Dname = value (许多编译器都支持)。

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

这样用户就可以输入: Make-f mymakefile.mk-SOMEOPTION var = 5

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

int main()
{
int i = var;
}
153777 次浏览

这样调用 make命令:

make CFLAGS=-Dvar=42

并确保在 Makefile 的编译命令中使用 $(CFLAGS)。正如@j ørgensen 提到的,将变量赋值放在 make命令之后将覆盖已经定义 Makefile 的 CFLAGS值。

或者,您可以在 CFLAGS以外的另一个变量中设置 -Dvar=42,然后在 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
$ cat x.mak
all:
echo $(OPTION)
$ make -f x.mak 'OPTION=-DPASSTOC=42'
echo -DPASSTOC=42
-DPASSTOC=42

调用 这个方式

make CFLAGS=-Dvar=42

因为您确实希望覆盖 Makefile 的 CFLAGS,而不仅仅是环境(对于 Makefile 变量,环境的优先级较低)。

在下面找到 C 文件和 Makefile 实现以满足您的需求

Fo.c

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

马克菲尔

all:
gcc -DMAKE_DEFINE=11 foo.c

由于名声不好,我不能评论这个被接受的答案。

我想提一下预定义的变量 CPPFLAGS。 它可能比 CFLAGSCXXFLAGS更适合,因为 GNU Make手册将其描述为:

额外的标志给 C 预处理器和使用它的程序 (C 和 Fortran 编译器)。

使用 CPPFLAGS的内置隐式规则示例

  • n.o是由 n.c自动生成的,其形式如下:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.o是由 n.ccn.cppn.C自动生成的,其形式如下:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

可以使用命令 make CPPFLAGS=-Dvar=123来定义所需的宏。

更多信息