【问题标题】:Multiple Definition in Hierarchy层次结构中的多重定义
【发布时间】:2014-09-12 04:50:24
【问题描述】:

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

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

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

我有这个包含 ASTAR.h 的 .h,以及类似的长层次结构:

    Agent
       |
   -Character-
   |          |
  Ally        Foe

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

当我编译时,ASTAR.h 出现很多多重定义错误,我不知道为什么会出现这种情况,因为我在 ASTAR.h 中有 #ifndef 代码

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

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

【问题讨论】:

    标签: c++ hierarchy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多