C 具有自动依赖关系的Makefile

C 具有自动依赖关系的Makefile,c,makefile,C,Makefile,假设我们有以下设置: 程序c 生成文件 (注意,我简化了Makefile,以便使问题更加明显) MYCC=gcc CC=$(MYCC)-MMD-MP-c 链接=$(MYCC)-o 目标=进展 全部:$(目标) 清洁: rm-f*.o*.d$(目标) 程序:程序 $(链接)$@$^ %.o:%.c $(CC)$< -包括$(SRC:%.c=%.d) 此makefile假定在第一次运行后自动创建依赖项(*.d个文件) 但是有点不对劲,因为如果我更改.h文件,它根本不会重建项目 [nmmm@zenb

假设我们有以下设置:

程序c 生成文件 (注意,我简化了Makefile,以便使问题更加明显)

MYCC=gcc
CC=$(MYCC)-MMD-MP-c
链接=$(MYCC)-o
目标=进展
全部:$(目标)
清洁:
rm-f*.o*.d$(目标)
程序:程序
$(链接)$@$^
%.o:%.c
$(CC)$<
-包括$(SRC:%.c=%.d)
此makefile假定在第一次运行后自动创建依赖项(*.d个文件)

但是有点不对劲,因为如果我更改.h文件,它根本不会重建项目

[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ ./prog 
hello world
[nmmm@zenbook ctest]$ touch prog.c 
[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ touch prog.h
[nmmm@zenbook ctest]$ make    << here is the problem
make: Nothing to be done for 'all'.
[nmmm@zenbookctest]$make
gcc-MMD-MP-c程序c
gcc-o程序
[nmmm@zenbookctest]$/进度
你好,世界
[nmmm@zenbookctest]$touch prog.c
[nmmm@zenbookctest]$make
gcc-MMD-MP-c程序c
gcc-o程序
[nmmm@zenbookctest]$touch prog.h

[nmmm@zenbookctest]$make您实际上从未在任何地方定义
SRC
。如果您显式设置它:

SRC = prog.c
或使用通配符:

SRC = $(wildcard *.c)

然后一切对我都有效。

可能重复的问题应该是:删除旧问题并发布新问题,或者编辑旧问题但不发布新问题。发布两个问题不会提高网站的质量。旧问题已删除。除此之外,编译规则需要将头文件列为从属文件。我从来不知道实际创建依赖性文件的#include语句。相反,需要一个规则,使用对sed的调用或对gcc的调用以及适当的参数。为了避免在调用“make clean”时重建依赖性文件,需要类似于“ifneq”$(MAKECMDGOALS)、“clean”-include$(DEP)endif”的内容。编译规则需要添加“%.d”作为依赖项;其中$(DEP)是一个包含依赖性文件名列表的宏建议行:'$(CC)$谢谢,你能告诉我这个src是否支持通配符吗?我可以把*.c放在那里吗?@Nick不仅仅是
*.c
,你还必须使用
通配符
功能。更新我的答案来说明。
[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ ./prog 
hello world
[nmmm@zenbook ctest]$ touch prog.c 
[nmmm@zenbook ctest]$ make
gcc -MMD -MP -c prog.c
gcc -o prog prog.o
[nmmm@zenbook ctest]$ touch prog.h
[nmmm@zenbook ctest]$ make    << here is the problem
make: Nothing to be done for 'all'.
SRC = prog.c
SRC = $(wildcard *.c)