';制作';与gcc中的-D标志等效
我的C代码有各种各样的文件,其中包含我只想在定义宏时执行的语句。我有两个文件,每个文件都有以下代码:';制作';与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
#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)。代码仍然会执行,就好像宏没有定义一样。