层次结构中的多重定义

时间:2014-09-12 04:50:25

标签: c++ hierarchy

我正在做一个很长的层次结构,我有下一个问题:

ifndef AGENT_H_
#define AGENT_H_
#include <OgreSceneNode.h>

#include "../AStar/ASTAR.h"
#include <limits>

我有这个.h,包括ASTAR.h,以及一个很长的层次结构,如:

    Agent
       |
   -Character-
   |          |
  Ally        Foe

所有这些.h只包括它父亲。

当我编译时,ASTAR.h会出现很多多个定义错误,我不知道为什么会这样,因为我在ASTAR.h中有#ifndef gard

有人知道为什么会这样吗?

uilding target: sieis_vg
Invoking: Cross G++ Linker
g++ -L/usr/local/lib -L/usr/local/lib/OGRE -o "sieis_vg"  ./Agents/AxeThrower.o ./Agents/Berserk.o ./Agents/Tarkan.o ./Agents/WoadRaider.o  ./DotSceneLoader.o ./EngineCameraController.o ./EngineFrameListener.o ./EngineInputListener.o ./EngineRenderer.o ./EngineSceneLoader.o ./EngineSceneManager.o ./EngineSound.o ./EngineStatus.o ./EngineWindowListener.o ./IAController.o ./stdafx.o   -lOgreMain -lOgreOverlay -lOgreTerrain -lOIS -lboost_system -lboost_thread -lfmodex64-4.44.41 -lfmodexL64-4.44.41
./Agents/Berserk.o:(.data+0x0): definiciones múltiples de `world_map'
./Agents/AxeThrower.o:(.data+0x0): primero se definió aquí
./Agents/Berserk.o: En la función `__gnu_cxx::new_allocator<AStarSearch<MapSearchNode>::Node*>::new_allocator()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: definiciones múltiples de `GetMap(int, int)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::IsSameState(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: definiciones múltiples de `MapSearchNode::IsSameState(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::PrintNodeInfo()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: definiciones múltiples de `MapSearchNode::PrintNodeInfo()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: definiciones múltiples de `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::IsGoal(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: definiciones múltiples de `MapSearchNode::IsGoal(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: primero se definió aquí
./Agents/Berserk.o: En la función `Character::continueWalking(float)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: definiciones múltiples de `MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode>*, MapSearchNode*)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::GetCost(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: definiciones múltiples de `MapSearchNode::GetCost(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: primero se definió aquí
./Agents/Berserk.o: En la función `MapSearchNode::getPath()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: definiciones múltiples de `MapSearchNode::getPath()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: primero se definió aquí
./Agents/Tarkan.o:(.data+0x0): definiciones múltiples de `world_map'
./Agents/AxeThrower.o:(.data+0x0): primero se definió aquí
./Agents/Tarkan.o: En la función `__gnu_cxx::new_allocator<AStarSearch<MapSearchNode>::Node*>::new_allocator()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: definiciones múltiples de `GetMap(int, int)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::IsSameState(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: definiciones múltiples de `MapSearchNode::IsSameState(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::PrintNodeInfo()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: definiciones múltiples de `MapSearchNode::PrintNodeInfo()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: definiciones múltiples de `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::IsGoal(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: definiciones múltiples de `MapSearchNode::IsGoal(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: primero se definió aquí
./Agents/Tarkan.o: En la función `Character::continueWalking(float)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: definiciones múltiples de `MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode>*, MapSearchNode*)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::GetCost(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: definiciones múltiples de `MapSearchNode::GetCost(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: primero se definió aquí
./Agents/Tarkan.o: En la función `MapSearchNode::getPath()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: definiciones múltiples de `MapSearchNode::getPath()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: primero se definió aquí
./Agents/WoadRaider.o:(.data+0x0): definiciones múltiples de `world_map'
./Agents/AxeThrower.o:(.data+0x0): primero se definió aquí
./Agents/WoadRaider.o: En la función `__gnu_cxx::new_allocator<AStarSearch<MapSearchNode>::Node*>::new_allocator()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: definiciones múltiples de `GetMap(int, int)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::IsSameState(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: definiciones múltiples de `MapSearchNode::IsSameState(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::PrintNodeInfo()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: definiciones múltiples de `MapSearchNode::PrintNodeInfo()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: definiciones múltiples de `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::IsGoal(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: definiciones múltiples de `MapSearchNode::IsGoal(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: primero se definió aquí
./Agents/WoadRaider.o: En la función `Character::continueWalking(float)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: definiciones múltiples de `MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode>*, MapSearchNode*)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::GetCost(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: definiciones múltiples de `MapSearchNode::GetCost(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: primero se definió aquí
./Agents/WoadRaider.o: En la función `MapSearchNode::getPath()':
/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: definiciones múltiples de `MapSearchNode::getPath()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: primero se definió aquí
./IAController.o:(.data+0x0): definiciones múltiples de `world_map'
./Agents/AxeThrower.o:(.data+0x0): primero se definió aquí
./IAController.o: En la función `__gnu_cxx::new_allocator<AStarSearch<MapSearchNode>::Node*>::new_allocator()':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:257: definiciones múltiples de `GetMap(int, int)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:257: primero se definió aquí
./IAController.o: En la función `MapSearchNode::IsSameState(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:296: definiciones múltiples de `MapSearchNode::IsSameState(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:296: primero se definió aquí
./IAController.o: En la función `MapSearchNode::PrintNodeInfo()':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:312: definiciones múltiples de `MapSearchNode::PrintNodeInfo()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:312: primero se definió aquí
./IAController.o: En la función `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:323: definiciones múltiples de `MapSearchNode::GoalDistanceEstimate(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:323: primero se definió aquí
./IAController.o: En la función `MapSearchNode::IsGoal(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:332: definiciones múltiples de `MapSearchNode::IsGoal(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:332: primero se definió aquí
./IAController.o: En la función `void std::__adjust_heap<__gnu_cxx::__normal_iterator<AStarSearch<MapSearchNode>::Node**, std::vector<AStarSearch<MapSearchNode>::Node*, std::allocator<AStarSearch<MapSearchNode>::Node*> > >, long, AStarSearch<MapSearchNode>::Node*, AStarSearch<MapSearchNode>::HeapCompare_f>(__gnu_cxx::__normal_iterator<AStarSearch<MapSearchNode>::Node**, std::vector<AStarSearch<MapSearchNode>::Node*, std::allocator<AStarSearch<MapSearchNode>::Node*> > >, long, long, AStarSearch<MapSearchNode>::Node*, AStarSearch<MapSearchNode>::HeapCompare_f)':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:348: definiciones múltiples de `MapSearchNode::GetSuccessors(AStarSearch<MapSearchNode>*, MapSearchNode*)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:348: primero se definió aquí
./IAController.o: En la función `MapSearchNode::GetCost(MapSearchNode&)':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:405: definiciones múltiples de `MapSearchNode::GetCost(MapSearchNode&)'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:405: primero se definió aquí
./IAController.o: En la función `MapSearchNode::getPath()':
/home/sergio/git/sieis_vg/Debug/.././Agents/../AStar/ASTAR.h:414: definiciones múltiples de `MapSearchNode::getPath()'
./Agents/AxeThrower.o:/home/sergio/git/sieis_vg/Debug/../Agents/../AStar/ASTAR.h:414: primero se definió aquí
/usr/bin/ld: warning: libboost_thread.so.1.54.0, needed by /usr/local/lib/libOgreMain.so, may conflict with libboost_thread.so.1.55.0
/usr/bin/ld: warning: libboost_system.so.1.54.0, needed by /usr/local/lib/libOgreMain.so, may conflict with libboost_system.so.1.55.0
collect2: error: ld returned 1 exit status
make: *** [sieis_vg] Error 1

1 个答案:

答案 0 :(得分:2)

您似乎定义标题中的函数,方法和变量。您只应在标头中声明,并在源中 define 。在标题中,您应该只定义内联成员函数(使用inline关键字声明或在类定义中定义)和模板。必须仅在源文件中定义任何其他函数,方法,变量或静态字段。