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

问题描述 投票:0回答:6

我通常使用以下选项将宏定义从“make命令行”传递到“makefile”: -D名称=值。该定义可以在 makefile 中访问。

我还使用类似的编译器选项将宏定义从“makefile”传递到“源代码”: -Dname=value(许多编译器都支持)。这个定义可以在源代码中访问。

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

因此用户可以输入:

make -f mymakefile.mk -SOMEOPTION var=5

然后直接main.c中的代码就可以看到

var
:

int main()
{
  int i = var;
}
c macros makefile
6个回答
134
投票

这样调用

make
命令:

make CFLAGS=-Dvar=42

并确保在 Makefile 的编译命令中使用

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

或者,您可以将

-Dvar=42
设置为
CFLAGS
之外的另一个变量,然后在
CFLAGS
中重用此变量,以避免完全覆盖
CFLAGS


19
投票

由于声誉较低,我无法评论已接受的答案。

我想提一下预定义变量

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
来定义所需的宏。

更多信息


15
投票

只需使用特定变量即可。

$ 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

make CFLAGS=-Dvar=42

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


1
投票
$猫x.mak 全部: 回显$(选项) $ make -f x.mak '选项=-DPASSTOC=42' 回声-DPASSTOC=42 -DPASSTOC=42
    

-3
投票
在下面找到C文件和Makefile实现来满足您的要求

foo.c

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

生成文件

all: gcc -DMAKE_DEFINE=11 foo.c
    
© www.soinside.com 2019 - 2024. All rights reserved.