Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Makefile规则不删除.o文件?_Makefile_Object Files - Fatal编程技术网

为什么我的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
中间文件,这样您就不必在微小的更改中强行重新编译所有文件。