我收到多条错误消息,说没有任何目标文件存在。是不是应该处理依赖关系并首先编译源代码?
CXX = g++
CXXFLAGS =
###############################
# Define header file variables
###############################
# Application
accuser = Accuser.h $(agent)
game = Game.h $(roomMgr) $(accuser)
# Actions
action = Action.h $(common) $(object) $(condition) $(goal) $(orderedPair) $(IExecutable)
actionList = ActionList.h $(stab) $(goTo) $(take) $(drop) $(bludgeon) $(strangle) $(shoot) $(waitFor)
actionMgr = ActionManager.h $(action) $(actionList) $(common)
actionRecord = ActionRecord.h
IExecutable = IExecutable.h $(common)
bludgeon = Bludgeon.h $(murder) $(agent)
drop = Drop.h $(action)
goTo = GoTo.h $(action) $(agent)
murder = Murder.h $(action) $(agent)
shoot = Shoot.h $(murder) $(agent)
stab = Stab.h $(murder) $(agent)
strangle = Strangle.h $(murder) $(agent)
take = Take.h $(action)
waitFor = WaitFor.h $(action) $(agent)
还有一些变量定义,然后是目标:
###############################
# Define dependencies
###############################
# Application
objects = $(game_obj) $(action_obj) $(condition_obj) $(object_obj) $(prop_obj) \
$(operator_obj) $(plangning_obj) $(world_obj) $(utilities_obj)
sauce : $(objects) $(action) $(game)
$(CXX) -o sauce $(objects)
Game.o : $(game) $(all_props) $(operationMgr) $(aciton)
Game_InitializeObjects.o : $(common) $(game) $(all_props)
game_obj = Game.o Game_InitializeObjects.o
# Actions
Action.o : $(action) $(agent) $(room) $(operatorMgr) $(roomMgr)
ActionManager.o : $(actionMgr)
Bludgeon.o : $(bludgeon) $(roomMgr)
Drop.o : $(drop) $(prop) $(room) $(roomMgr) $(agent)
GoTo.o : $(goTo) $(room) $(roomMgr)
Murder.o : $(murder) $(roomMgr) $(room) $(factMgr)
Shoot.o : $(shoot) $(roomMgr)
Stab.o : $(Stab) $(roomMgr)
Strangle.o : $(strangle) $(roomMgr) $(room)
Take.o : $(take) $(roomMgr) $(room) $(agent) $(prop)
Waitfor.o : $(waitfor) $(room) $(roomMgr)
action_obj = Action.o ActionManager.o Bludgeon.o Drop.o GoTo.o Murder.o Shoot.o Stab.o \
Strangle.o Take.o WaitFor.o
然后是更多目标。
答案 0 :(得分:0)
所以我们已经确定Makefile能够使用built in implicit rules将.cpp文件编译成目标文件。
我收到多条错误消息,说没有任何目标文件存在。是不应该首先处理依赖项并编译源代码?
这些必须来自编译器而不是make。 (如果我能看到它们会更容易调试!)
那么问题就是变量的评估顺序。 GNU make 手册解释了它如何评估Makefile here。
在此处扩展配方的先决条件时:
sauce : $(objects) $(action) $(game)
objects
尚未分配,因此扩展为空。
食谱中的扩展:
$(CXX) -o sauce $(objects)
作为分配objects
的后期阶段。
如果在分配给对象之后移动规则定义,并且动作如下所示,它应该正常工作。
game_obj = Game.o Game_InitializeObjects.o
action_obj = Action.o ActionManager.o Bludgeon.o Drop.o GoTo.o Murder.o Shoot.o Stab.o \
Strangle.o Take.o WaitFor.o
objects = $(game_obj) $(action_obj) $(condition_obj) $(object_obj) $(prop_obj) \
$(operator_obj) $(plangning_obj) $(world_obj) $(utilities_obj)
sauce : $(objects) $(action) $(game)
$(CXX) -o sauce $(objects)
由于使用recursively expanded variables(分配了=
而不是:=
的人),action_obj
和objects
的具体分配顺序并非如此只要它们在扩展之前都被分配,就会很重要。
在制作文件中出现objects
的规则之前,必须先分配作为展开sauce
一部分而展开的所有变量。