【发布时间】:2016-11-04 00:02:43
【问题描述】:
我的makefile 运行,但它不执行rm -f $(PROJECT) $(OBJ) 指定的目标文件和可执行文件的清理。我做错了什么?
制作文件
PROJECT = cfind
HEADERS = $(cfind.h)
OBJ = argv.o globals.o main.o pathInfo.o
C99 = cc -std=c99
CFLAGS = -Wall -pedantic -Werror
$(PROJECT) : $(OBJ)
$(C99) $(CFLAGS) -o $(PROJECT) $(OBJ)
%.o : %.c $(HEADERS)
$(C99) $(CFLAGS) -c $<
clean:
rm -f $(PROJECT) $(OBJ)
【问题讨论】:
-
你使用什么命令来运行makefile?如果不是
make clean,为什么要成为那个目标? -
make系统的主要目标之一是只运行需要运行以指定目标的内容。 -
你告诉它要制定什么目标?它会做任何你告诉它做的目标。如果不指定目标,则使用 makefile 中的第一个目标。
-
如果要设为默认目标就对了。如果您希望
clean成为默认目标的一部分,请将$(PROJECT) : $(OBJ)更改为$(PROJECT) : clean $(OBJ)来添加它。但这太愚蠢了——为什么让它依赖于它无论如何都要删除的文件呢?为什么即使什么都没有改变,你还要它重建项目? -
不,使用该目标是因为它是第一个目标的依赖项。第一个目标将
$(OBJ)作为依赖项。说argv.o不存在。然后make会知道它需要这样做才能创建默认目标,因此它会为此查找规则,并匹配%.o规则。$(OBJ)表示如果不首先确保$(OBJ)中的所有内容都是最新的,您就无法实现该目标。