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

时间:2012-01-29 11:22:32

标签: c macros makefile

我通常使用以下选项将宏定义从“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;
}

6 个答案:

答案 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。 它可能表示比CFLAGSCXXFLAGS更好的拟合度,因为 GNU Make 手册将其描述为:

  

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

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

  • n.on.c自动制成,格式为:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.o是由n.ccn.cppn.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