繁体   English   中英

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

[英]How to pass macro definition from “make” command line arguments (-D) to C source code?

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

make这种方式调用make命令:

make CFLAGS=-Dvar=42

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

或者,您可以在另一个变量中设置-Dvar=42而不是CFLAGS ,然后在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

打电话就是这样

make CFLAGS=-Dvar=42

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

由于声誉低,我不能评论接受的答案。

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

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

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

  • no从自动进行nc与以下形式的配方:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • no从自动进行n.ccn.cpp ,或nC与以下形式的配方:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

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

更多信息

$ cat x.mak
all:
    echo $(OPTION)
$ make -f x.mak 'OPTION=-DPASSTOC=42'
echo -DPASSTOC=42
-DPASSTOC=42

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

foo.c的

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

Makefile文件

all:
    gcc -DMAKE_DEFINE=11 foo.c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM