我的 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
我如何使它工作?
最佳答案
第三种形式是正确的(make all CFLAGS=-DSOME_MACRO=10
或只是make all CFLAGS=-DSOME_MACRO
)。但是您调用的 make 文件必须实际使用该 CFLAGS
宏。
品牌 implicit rules编译可执行文件或 objective-c 文件将使用 CFLAGS
,但如果不查看该 makefile 的内容或 make 的输出,我们无法判断它是被调用还是被覆盖。
make 的输出应该显示构建命令。从 .c
文件生成 .o
的隐式规则是 $(CC) $(CPPFLAGS) $(CFLAGS) -c
所以你应该看到类似 cc -DSOME_MACRO=2 -DFOO=99 -c -o x.o x.c
给你编译目标文件,如果你编译可执行文件则类似。
还要确保您的清洁计划正确 make clean
。并确保清理实际上是递归的(即也清理您的“模块”项目)...
编辑:哦,是的...正如@nneonneo 的回答指出的那样,您在递归 make 调用时也有错误,这绝对是一个问题(我认为您正在直接运行第二个 make 命令以调试问题..)。以上可能仍然适用。
关于c - 'make' 等同于 gcc 中的 -D 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415364/