我有以下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,并且它们以相同的方式编写,但我可以重复生成相同的命令而没有"最新"问题.
我用谷歌搜索但没有发现类似于我的问题(他们通常似乎涉及在制作之前没有清洁的用户).
感谢任何人阅读.
lij*_*jie 10
在adjl
和adjm
目标是真正的目标.由于它们没有依赖关系,并且存在文件(列表中的2个目录),因此make不会执行任何操作(因为它们存在).
但是,您想要的是指定adjl
和adjm
作为伪目标(以便在指定命令时执行命令).为此,
.PHONY: adjl adjm
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请阅读http://www.gnu.org/software/automake/manual/make/Phony-Targets.html.
编辑
事实上,real_clean
和clean
规则也许应该还可以制成假.