为什么我的Makefile规则不删除.o文件?
我的为什么我的Makefile规则不删除.o文件?,makefile,object-files,Makefile,Object Files,我的Makefile工作正常,但调用make 我一直在寻找像我这样的主题的堆栈溢出,但我还不能理解其原因 以下是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) pr
Makefile
工作正常,但调用make
我一直在寻找像我这样的主题的堆栈溢出,但我还不能理解其原因 以下是
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 $@ $^
EXEC=程序
来源=main.c
对象=$(源:.c=.o)
CC=gcc-pthread-lpthread
CFLAGS=-std=gnu99-g
.假冒:干净
默认值:$(执行)
main.o:main.c
清洁:
-rm*.o$(对象)程序
%.o:%.c
$(CC)-o$@-c$<$(CFLAGS)
$(执行):$(对象)
$(CC)-o$@$^
如果要在生成步骤后删除对象文件,只需将rm-f*.o
命令附加到$(EXEC)
目标
此外,评论中还指出了一些注意事项:
- Makefile变量名区分大小写。使用
或对象
,不能同时使用两者对象
- 您应该使用
,而不是在$(EXEC)
目标中硬编码clean
。这样,您就不必每次更改程序名称时都更改它程序
- 您通常希望编译后保留
文件,这样您就不必在一个小改动后重新编译所有文件.o
.INTERMEDIATE
特殊目标自动删除目标文件,而不是在源未更改时不必要地重建它们。只需添加这一行:
.INTERMEDIATE: $(OBJECTS)
案例事项:
$(对象)
应该是$(对象)
当您运行makeclean
时,您的makefile仅删除.o
文件。默认情况下,您不会运行makeclean
。不清楚是否真的要在每次生成后删除.o
文件。如果这样做,您将在每次运行make
时重新编译程序,这通常不是人们想要的。如果确实确定,请使用默认值:$(EXEC)clean
——但不要这样做。实际上,由于clean
规则删除了program
,也就是$(EXEC)
,因此编写默认值:
规则实际上会在编译后删除该程序。不helpful@Barmar-您是对的(关于宏名称的大小写敏感性),但是由于命令行的*.o
部分,因此clean
规则仍将删除.o
文件。该命令可能还应列出$(EXEC)
,以便在更改可执行文件名时,清除规则匹配。通常,您希望保留.o
中间文件,这样您就不必在微小的更改中强行重新编译所有文件。