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


107

我通常使用-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;
}

15
为什么要下票?在我看来,这是一个完全合理的问题。
Thomas

Answers:


99

make这种方式调用命令:

make CFLAGS=-Dvar=42

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

或者,您可以设置-Dvar=42另一个变量CFLAGS,然后再使用此变量CFLAGS以避免完全覆盖CFLAGS


8
您不能使用“ CFLAGS = $(CFLAGS)-Wall”;这将是一个递归定义,make不允许这样做。您可以使用“ CFLAGS:= $(CFLAGS)-Wall”或“ CFLAGS + = -Wall”,但是这些都不起作用,因为在命令行上的分配具有更高的优先级。您可以使用“覆盖CFLAGS + = -Wall”,但是通常我们建议您在内部选择其他变量。GNU编码标准要求留给用户CFLAGS等,makefile选择另一个变量,例如“ local_CFLAGS = $(CFLAGS)-Wall”。
MadScientist 2012年

2
只需添加到@MadScientist说明,GNU编码标准也是国家认为$(CFLAGS)应该放在最后,这样由用户指定的任何选项将覆盖任何Makefile文件在内部设置。那意味着使用例如local_CFLAGS = -Wall $(CFLAGS)。相反,如果您确实想优先处理某些事情,请将其放在之后$(CFLAGS),如@MadScientist注释中所示。
山姆

1
如何通过此设置多个宏?
Woody Huang

2
例如CFLAGS="-Dvar1=42 -Dvar2=314"
@WoodyHuang

1
CPPFLAGS可能是一个更适合比CFLAGSCXXFLAGSstackoverflow.com/a/53527858/2278206
PSQ

11

只需为此使用一个特定的变量。

$ 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

10

这种方式打电话

make CFLAGS=-Dvar=42

因为您确实想覆盖Makefile的CFLAGS,而不仅仅是环境(在Makefile变量方面优先级较低)。


6

由于信誉不佳,我无法评论已接受的答案。

我想提一下预定义变量CPPFLAGS。这可能是一个更适合比CFLAGS或者CXXFLAGS,因为它是由所描述的GNU制作手册为:

额外的标志提供给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定义所需的宏。

更多信息


1
$猫x.mak
所有:
    回声$(OPTION)
$ make -f x.mak'OPTION = -DPASSTOC = 42'
回声-DPASSTOC = 42
-DPASSTOC = 42

-4

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

foo.c

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

生成文件

all:
    gcc -DMAKE_DEFINE=11 foo.c

问题是“不更改makefile”将来自make命令行的任意定义直接传递给C源代码。因此,我想一次更改我的makefile,以允许进行那些任意定义。
MohamedEzz 2015年

不适用于make。那是使-DMAKE_DEFINE = 11表示无效的选项。
Ramakrishnan Kannan 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.