[英]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
。 它可能比CFLAGS
或CXXFLAGS
更合適,因為它被GNU Make手冊描述為:
提供給C預處理器和使用它的程序的額外標志(C和Fortran編譯器)。
CPPFLAGS
的內置隱式規則的示例 no
從自動進行nc
與以下形式的配方:
$(CC) $(CPPFLAGS) $(CFLAGS) -c
no
從自動進行n.cc
, n.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.