Ok一点介绍到这个问题:我在 c++/DirectX11在Visual Studio 2012上运行在Windows 7 - 64位操作系统的渲染引擎(编译在32位模式)上工作,我有一个奇怪的链接错误,出现在我的Entity
类(Entity3D就像场景的基本演员)。
我所有的边界体类都继承自一个Shape3D类。每个实体都有一个Shape3D* boundingVolume成员,在初始化时初始化为特定的形状类型。
当两个Shape3D s之间发生碰撞时,我通过一个函数- bool Intersect(Shape3D* a, Shape3D* b)
该函数然后检查它们的类型(Sphere/*Box*/Whatever),该类型表示一个数字,该数字是函数指针数组中函数的索引:
bool(*IntersectArray[4][4])(Shape3D* a, Shape3D* b) =
{
{
IntersectSphereSphere,
IntersectSphereBox,
IntersectSphereOrientedBox,
IntersectSphereFrustum,
},
{
IntersectBoxSphere,
IntersectBoxBox,
IntersectBoxOrientedBox,
IntersectBoxFrustum
},
{
IntersectOrientedBoxSphere,
IntersectOrientedBoxBox,
IntersectOrientedBoxOrientedBox,
IntersectOrientedBoxFrustum
},
{
IntersectFrustumSphere,
IntersectFrustumBox,
IntersectFrustumOrientedBox,
IntersectFrustumFrustum
}
};
这就像一个虚拟调度。InersectArray
是函数的数组(在intersect。h中声明)这就是导致链接错误的原因:
error LNK1169: one or more multiply defined symbols found
error LNK2005: "char (__cdecl*(* Engine::Collision::IntersectArray)[4])(class Engine::Collision::Shape3D *,class Engine::Collision::Shape3D *)" (?IntersectArray@Collision@Engine@@3PAY03P6ADPAVShape3D@12@0@ZA) already defined in Entity3D.obj
File Intersect.obj
Intersect.h仅包含在Entity3D.cpp中,它不包含在Entity3D.h中,也不包含在Entity3D.h包含的任何头文件中。Entity3D.cpp仅包含Entity3D.h和Intersect.h。我清理和重建,错误仍然存在。Intersect(Shape3D a, Shape3D* b)*仅在Entity3D.cpp文件中Entity3D的一个方法中调用。项目中当前没有其他编译错误或警告。还有什么能引起这样的问题呢?
修复了这个问题,我只是在Intersect.cpp文件中移动了IntersectArray的定义,因为现在这是唯一需要的地方。