Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';制作';与gcc中的-D标志等效_C_Linux_Makefile - Fatal编程技术网

';制作';与gcc中的-D标志等效

';制作';与gcc中的-D标志等效,c,linux,makefile,C,Linux,Makefile,我的C代码有各种各样的文件,其中包含我只想在定义宏时执行的语句。我有两个文件,每个文件都有以下代码: #ifdef SOME_MACRO printf("macro defined\n"); #else printf("macro undefined"); #endif 我的Makefile包含: make -C /lib/modules/$(shell uname -r )/build M=$(PWD) modules $(CFLAGS) 我把make称为: make all CFLAGS

我的C代码有各种各样的文件,其中包含我只想在定义宏时执行的语句。我有两个文件,每个文件都有以下代码:

#ifdef SOME_MACRO
printf("macro defined\n");
#else
printf("macro undefined");
#endif
我的Makefile包含:

make -C /lib/modules/$(shell uname -r )/build M=$(PWD) modules $(CFLAGS)
我把make称为:

make all CFLAGS=SOME_MACRO=10    
当我执行生成的程序时,我得到“宏未定义”,表示宏未定义

我还试着将其称为:

make all CFLAGS=SOME_MACRO
这给了我:

make[1]: *** No rule to make target `SOME_MACRO'.  Stop.
make[1]: Leaving directory `/X/Y/Z'
make: *** [default] Error 2
并称之为:

make all CFLAGS=-DSOME_MACRO=10
正如给定的那样,但这也不起作用

我该怎么做呢?

第三种形式是正确的(
makeall-CFLAGS=-DSOME\u MACRO=10
或只是
makeall-CFLAGS=-DSOME\u MACRO
)。但是您正在调用的make文件必须实际使用该
CFLAGS

用于编译可执行文件或对象c文件的Make将使用
CFLAGS
,但如果不查看Make文件的内容或Make的输出,我们无法判断它是否被调用或重写

make的输出应该显示build命令。从
.c
文件生成
.o
的隐式规则是
$(CC)$(CPPFLAGS)$(CFLAGS)-c
,因此在编译对象文件时,您应该会看到类似于
CC-DSOME\u MACRO=2-DFOO=99-c-o x.o x.c
的内容,在编译可执行文件时也会看到类似的内容

还要确保您的清洁项目正确
makeclean
。并确保clean实际上是递归的(即,也会清理“模块”项目)

编辑:哦,是的。。。正如@nneonneo的回答所指出的,您在递归make调用时也有一个错误,这肯定是一个问题(我想您是直接运行第二个make命令来调试问题的……)。上述内容可能仍然适用。

您的Makefile包含

make -C /lib/modules/$(shell uname -r )/build M=$(PWD) modules $(CFLAGS)
它将变量
CFLAGS
的值作为
make
参数传递。这不是你想要的。改用
CFLAGS=$(CFLAGS)

make -C /lib/modules/$(shell uname -r )/build M=$(PWD) modules CFLAGS=$(CFLAGS)

要将
CFLAGS
传递到子make,只需使用
make CFLAGS=-DSOME_MACRO=10
进行构建。

它仍然不工作,可能是CFLAGS被覆盖的情况。那么,是否可以在另一个变量中发送值?不管怎样,我甚至试过做CFLAGS+=-DSOME_MACRO=10,但都不起作用。@RaunaqKochar。这是可能的。是的,你可以发送任何你喜欢的变量。CFLAGS只是隐式规则使用的常规名称。因此,您可以使用
makeall-XFLAGS=-DSOME\u MACRO…
,但您需要在生成可执行文件的makefile中找到编译规则,并在命令行中粘贴
$(XFLAGS)
。请确保您也先执行
清洁
!尝试过之后,错误就消失了,但是宏未定义时的代码段仍在运行。可能是因为CFLAGS被覆盖。那么,是否有任何方法可以将其他变量发送到makefile中的make命令?正确的方法是在makefile中的某个地方,或者作为相关规则的特定于目标的变量
make
也应该是。@user657267那么我实际上如何运行该命令呢?比如说,我想定义一些_宏?我应该仍然使用CFLAGS变量吗?@RaunaqKochar命令行上设置的变量默认情况下导出为子模型,如果在配方中将
make
替换为
$(make)
,您应该会发现它按原样工作。@user657267我做了$export CFLAGS=-DSOME\u MACRO=10。在Makefile中,我的命令是$(MAKE)-C/lib/modules/$(shell uname-r)/buildm=$(PWD)modules CFLAGS+=$(CFLAGS)。代码仍然会执行,就好像宏没有定义一样。