Makefile始终认为项目是最新的 - 但文件甚至不存在

时间:2010-12-14 02:49:22

标签: c++ makefile

我有以下makefile:

CCC = g++
CCFLAGS = -ansi

driver: driver.o graph.o
        $(CCC) -o driver driver.o graph.o

graph.o: graph.h
driver.o: graph.h

adjl:
        rm -f graph.h graph.cc
        ln -s adjl/graph.cc .
        ln -s adjl/graph.h .
        touch graph.cc graph.h
adjm:
        rm -f graph.h graph.cc
        ln -s adjm/graph.cc .
        ln -s adjm/graph.h .
        touch graph.cc graph.h

clean:
        rm -f *.o
real_clean: clean
        rm -f graph.cc graph.h
        rm -f driver

我的想法是我尝试链接两个不同的.cc / .h文件,具体取决于我想要使用的实现。如果我make_clean,没有.cc / .h文件存在,我只有一个driver.cc文件和文件夹中的makefile。如果我打电话给make,它说它们是最新的。即使我在adjl / adjm中编辑文件以使它们成为“更新”版本,也会发生这种情况。

 [95]% ls
adjl/  adjm/  driver.cc  makefile
 [96]% make adjl
make: `adjl' is up to date.
 [97]% make adjm
make: `adjm' is up to date.

我从我做过的另一个项目中获取了模板makefile,并且它们以相同的方式编写,但我可以重复生成相同的命令而没有“最新”问题。

我用谷歌搜索但没有发现类似于我的问题(它们通常似乎涉及在制作之前没有清洁的用户)。

感谢任何人阅读。

3 个答案:

答案 0 :(得分:21)

问题是您的目录名称与Makefile中的目标相同。

当您发出make adjl对其找到但未执行任何操作的文件adjl进行检查时。 将目标重命名为其他内容并重试。

答案 1 :(得分:10)

adjladjm目标是真正的目标。由于它们没有依赖关系,并且存在文件(列表中的2个目录),因此make不会执行任何操作(因为它们存在)。

但是,您想要的是将adjladjm指定为伪目标(以便在指定命令时执行这些命令)。为此,

.PHONY: adjl adjm

阅读http://www.gnu.org/software/automake/manual/make/Phony-Targets.html了解详情。

修改

事实上,real_cleanclean规则也可能是虚假的。

答案 2 :(得分:3)

您的目录与目标同名。

由于您的目标不依赖于任何内容,因此它们始终被视为最新目标。

指定未链接到磁盘上文件的目标时,需要使用特殊目标.PHONY

.PHONY: adjl adjm

你也应该为clean和real_clean目标做同样的事情 - 否则如果有人创建了一个名为“clean”的文件,它们就会中断。