制造麻烦:它在编译之前尝试链接

时间:2014-03-15 19:18:11

标签: c++ makefile

我收到多条错误消息,说没有任何目标文件存在。是不是应该处理依赖关系并首先编译源代码?

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

然后是更多目标。

1 个答案:

答案 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_objobjects的具体分配顺序并非如此只要它们在扩展之前都被分配,就会很重要。

在制作文件中出现objects的规则之前,必须先分配作为展开sauce一部分而展开的所有变量。