簡體   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