【问题标题】:Makefile prerequisite variable evaluationMakefile先决条件变量评估
【发布时间】:2011-07-29 00:00:58
【问题描述】:

我有一个包含多个 Makefile 的大型项目,我需要修改项目的构建顺序。但是,我似乎无法理解作为先决条件的变量何时被评估。我读过的所有内容似乎都表明在构建依赖图之前解析了整个 Makefile,所以我不明白为什么这个示例不起作用:

OBJECTS=main.o
EXE_NAME=test.exe

$(EXE_NAME): $(OBJECTS)
    @echo PREREQUISITES: $^
    @echo OBJECTS: $(OBJECTS)
    $(CXX) $(CXXFLAGS) $(OBJECTS) -o $@

#include shape.mk
#----VV---Contents of shape.mk---VV----
OBJECTS+=Shape.o
OBJECTS+=Square.o
Shape.o: Shape.hpp
Square.o: Shape.hpp Square.hpp
#----^^----End of shape.mk-------^^----

main.o: Square.hpp

.PHONY: clean

clean:
    -rm -fr $(OBJECTS) $(EXE_NAME)

但是,当我运行这个 Makefile 时,我得到:

PREREQUISITES: main.o
OBJECTS: main.o Shape.o Square.o
g++  main.o Shape.o Square.o -o test.exe
g++: Shape.o: No such file or directory
g++: Square.o: No such file or directory
make: *** [test.exe] Error 1

为什么构建依赖图时OBJECT没有正确的值?

【问题讨论】:

  • 请注意,您也可以为此使用二级扩展。这样,作为目标或先决条件的变量可以在包含它们的规则之后定义。

标签: makefile


【解决方案1】:

是的,在构建依赖图之前解析了整个Makefile,但是按顺序读取规则和定义。您将test.exe 规则定义为

test.exe: main.o
  ...

然后您继续重新定义 OBJECTS,但您已经承诺遵守该规则,因此 Make 将使用该规则来构建图表。

试试这个:

$(EXE_NAME):  # This will be first, the default target.

include shape.mk                                                               

$(EXE_NAME): $(OBJECTS)
  ...

【讨论】:

  • 谢谢,这解决了我的问题。所以这意味着当我编写 Makefiles 时,我需要确保在使用它的规则之前定义任何用作先决条件的变量?如果我使用变量作为目标,情况是否相同?
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-05-05
相关资源
最近更新 更多