为什么我的 Makefile 规则不删除 .o 文件?

Why is my Makefile rule not deleting .o files?

我的 Makefile 可以工作,但我仍然在调用 make.
时创建 main.o 文件 我一直在通过 Stack Overflow 寻找像我这样的主题,但我一直无法理解原因。

这是 Makefile 的内容:

EXEC=program
SOURCES=main.c
OBJECTS=$(SOURCES:.c=.o)
CC=gcc -pthread -lpthread
CFLAGS=-std=gnu99 -g

.PHONY: clean

default: $(EXEC)

main.o: main.c
clean:
    -rm *.o $(objects) program

%.o: %.c
    $(CC) -o $@ -c $< $(CFLAGS)

$(EXEC): $(OBJECTS)
    $(CC) -o $@ $^

如果您希望在构建步骤后删除目标文件,只需将 rm -f *.o 命令附加到 $(EXEC) 目标即可。

另外,评论中指出的几点:

  • Makefile 变量名称区分大小写。使用 objectsOBJECTS,不能同时使用。

  • 您应该使用 $(EXEC),而不是在您的 clean 目标中硬编码 program。这样您就不必在每次更改程序名称时都更改它。

  • 您通常希望在编译后保留 .o 个文件,这样您就不必在进行小改动后重新编译所有内容。

您可以通过 .INTERMEDIATE 特殊目标使它们 intermediate files 使 Make 自动删除您的目标文件 -- 而不是在源未更改时不必要地重建它们。只需添加这一行:

.INTERMEDIATE: $(OBJECTS)