Makefile目标被调用两次

图片

我有以下Makefile:

 VERSION     = 0.1.1
 CC          = g++
 CFLAGS      = -Wall -g -DVERSION=\"$(VERSION)\"
 LDFLAGS     = -lm

 DEPFILE     = .dep
 SOURCES     := ${wildcard *.cpp}
 HEADERS     := ${wildcard *.h}
 OBJECTS     := ${SOURCES:.cpp=.o}
 BINARY      = main.exe


 .PHONY:     all dep clean


 all:        $(BINARY)

 $(BINARY):  $(DEPFILE) $(OBJECTS)
     $(CC) $(CFLAGS) -o $(BINARY) $(OBJECTS) $(LDFLAGS)

 %.o: %.cpp
     $(CC) $(CFLAGS) -c $<

 dep:        $(DEPFILE)

 $(DEPFILE): $(SOURCES) $(HEADERS)
     $(CC) -MM $(SOURCES) > $(DEPFILE)

 -include $(DEPFILE)

 clean:
     rm -vf $(BINARY) $(OBJECTS) $(DEPFILE)

当我跑make dep我得到

g++ -MM Monomial.cpp main.cpp Variable.cpp > .dep
make: Nothing to be done for 'dep'.

好像dep被叫了两次。这是为什么?

我正在Cygwin下使用GNU Make 4.2.1。


如果您发现一些不良的设计模式(而不是两次调用dep),还可以给我一些Makefile最佳实践的话,那也很好。

贝塔

您的makefile包含一个include指令:

-include $(DEPFILE)

因此,在启动Make时,它甚至不会考虑您要求其构建的目标,它会尝试重建将包含在makefile中的文件。一旦完成重建.dep,它会工作的要求您提供的文件......这是.dep

您可能make dep永远不必显式地

根据这一事实以及自动变量的有用性质,您可以简化几个规则

$(BINARY): $(OBJECTS)
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

$(DEPFILE): $(SOURCES) $(HEADERS)
    $(CC) -MM $(SOURCES) > $@

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章