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

Dwa*_*yne 12 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,并且它们以相同的方式编写,但我可以重复生成相同的命令而没有"最新"问题.

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

感谢任何人阅读.

ste*_*anB 22

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

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


lij*_*jie 10

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

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

.PHONY: adjl adjm
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读http://www.gnu.org/software/automake/manual/make/Phony-Targets.html.

编辑

事实上,real_cleanclean规则也许应该还可以制成假.