【问题标题】:Makefile target gets called twiceMakefile 目标被调用两次
【发布时间】:2018-04-17 21:20:59
【问题描述】:

我有以下 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 gnu-make


    【解决方案1】:

    您的 makefile 包含一个 include 指令:

    -include $(DEPFILE)
    

    因此,当 Make 启动时,它甚至在考虑您要求它构建的目标之前,它会尝试重新构建要包含在 makefile 中的文件。一旦完成重建.dep,它就可以处理您要求的文件......这是.dep

    您可能永远不必明确地make dep

    鉴于这一事实以及automatic variables 的有用性质,您可以简化一些规则:

    $(BINARY): $(OBJECTS)
        $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
    
    $(DEPFILE): $(SOURCES) $(HEADERS)
        $(CC) -MM $(SOURCES) > $@
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2023-03-30
      • 2016-04-01
      • 2012-05-05
      • 2017-01-19
      • 2014-02-04
      相关资源
      最近更新 更多