c - 'make' 等同于 gcc 中的 -D 标志

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

当我执行生成的程序时,我得到“宏未定义”指示宏未定义。

我也试过称它为:

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但这也不起作用。

我如何使它工作?

最佳答案

第三种形式是正确的(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/

相关文章:

c - 为变量赋值

c - 位移位打印位改变C中的int?

c - 取消引用 char 指针

linux - grep Linux 中特定的一段命令输出

linux - bash - 如何按字数将长字符串分成多个字符串

用于编译源文件列表的 Makefile

c - 使用一个 Makefile 从不同的文件生成不同的可执行文件

c - 如何列出 C 目录中目录中的文件?

bash - 使用 MAKEFLAGS 覆盖包含空格的 make 变量

python - 查找包含给定文件的文件系统的大小和可用空间