2014-09-02 57 views
2

通过MakeFiles时,我发现当命名为目标的文件即使不使用.PHONY时也存在,目标正在建立。 但是,当我对另一个目标进行相同的处理时,即清理时,目标没有建立起来,并说“清理是最新的”,这是可以的。 我只想知道当文件存在于当前目录时为什么另一个目标正在建立。如果在当前目录中已经存在名为目标的文件时没有.PHONY目标

生成文件:

CC:= gcc 
CCFLAGS:=-Wall -Wextra 
hello: hellomake.o hellofunc.o 
     $(CC) $(CCFLAGS) hellomake.c hellofunc.c -o file 
hellomake.o : hellomake.c 
     $(CC) $(CCFLAGS) -c hellomake.c 
hellofunc.o : hellofunc.c 
     $(CC) $(CCFLAGS) -c hellofunc.c 
clean: 
     rm -rf *.o 
     rm -rf file 

我的当前目录下的文件已命名相同的目标,如 “你好”。 它应该给结果为“你好达最新的”,但它没有这样做,并给输出: 让你好

gcc -Wall -Wextra hellomake.c hellofunc.c -o file 

请告诉这是为什么构建目标时目标不.phony和作为目标命名的文件已经存在于当前目录中。

+1

如果'hellomake.c'或'hellofunc.c'比最新'hello'它会重建。运行'make hello'两次,你可以在第二次看到它会给你好是uptodate – 2014-09-02 08:41:20

+1

'我只是想知道为什么当文件存在于当前目录时,其他目标正在建立'你应该检查目标是否重建即使依赖关系没有被修改。 – 2014-09-02 08:42:50

+0

创建了我在makefile中使用的文件后,我在我的目录中创建了“hello”文件。但即使没有.PHONY,makefile也不会给出任何错误。通常,当与目标名称相同的文件存在于当前目录中时,它不应该运行目标的命令,不使用.PHONY,但在我的情况下,它是这样做的。 :) – Mayank 2014-09-02 12:50:17

回答

3

因为make查看上次修改时间来决定要构建的内容。从make manual

make程序使用makefile文件数据库和文件的最后修改时间来决定哪些文件需要更新。

命令make检查目标及其先决条件之间的时间关系。如果先决条件已在目标后被修改,则意味着目标已过期,即使文件存在,也会触发重建。所以很可能你的依赖关系在目标之后被修改了。

为了避免这种情况,您可以:

  • 使用touch更改目标时间戳。
  • 在调用make hello之前使用make -t hellomake --touch hello。从docs
‘-t’ 
‘--touch’ 
Marks targets as up to date without actually changing them. In other words, 
make pretends to update the targets but does not really change their 
contents; instead only their modified times are updated. 
+0

避免这种行为的最好方法是简单地使用配方创建的文件的名称作为目标,这是make如何工作的。所以如果你的配方建立一个名为'file'的文件,就像上面的配方('gcc ... -o file')一样,那么目标名称应该是'file',而不是'hello'。然后它将按预期工作。 – MadScientist 2014-09-02 11:44:03

相关问题