'make'相当于-g标志,如gcc中所示

时间:2016-11-04 04:37:01

标签: 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=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

给定herehere,但这也不起作用。

我如何使这项工作?

2 个答案:

答案 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。并确保干净实际上是递归的(即清理你"模块"也投射)......

编辑:哦是的...正如@ n​​neonneo的答案所指出的那样,你在递归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进行构建。