我的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
当我执行生成的程序时,我得到'macro undefined',表示没有定义宏。
我也试过把它称为:
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
我如何使这项工作?
答案 0 :(得分:2)
第三种形式是正确的(make all CFLAGS=-DSOME_MACRO=10
或仅make all CFLAGS=-DSOME_MACRO
)。但是您调用的make文件必须实际使用CFLAGS
宏。
制作implicit rules用于编译可执行文件或对象的c文件将使用CFLAGS
,但我们无法判断它是在被调用还是被覆盖而没有看到makefile或make的输出。
make的输出应该显示构建命令。从.o
文件生成.c
的隐式规则是$(CC) $(CPPFLAGS) $(CFLAGS) -c
,因此在编译目标文件时应该看到类似cc -DSOME_MACRO=2 -DFOO=99 -c -o x.o x.c
的内容,如果编译可执行文件则类似
另外,请确保您的清洁项目正确投射make clean
。并确保干净实际上是递归的(即清理你"模块"也投射)......
编辑:哦是的...正如@ nneonneo的答案所指出的那样,你在递归make调用中也有一个错误,这肯定是一个问题(我认为你正在运行第二个make命令直接调试问题..)。以上可能仍然适用。
答案 1 :(得分:1)
您的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 CFLAGS=-DSOME_MACRO=10
进行构建。