好的,对该问题进行一些介绍:我正在使用在Windows 7 - 64 位操作系统上运行的Visual Studio 2012中的C++/DirectX11中的 C++/DirectX11 中的渲染引擎(以 32 位模式编译),并且出现了一个奇怪的链接错误我的班级(Entity3D就像场景的基本演员)。
我所有的包围体类都继承自一个Shape3D类。每个实体都有一个Shape3D * boundingVolume 成员,它在初始化时被初始化为特定的形状类型。当两个Shape3D
之间发生碰撞时,我通过一个函数传递它们 -然后该函数检查它们的类型(球体Entity
bool Intersect(Shape3D* a, Shape3D* b)
/*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的一种方法中调用。项目中当前没有其他编译错误或警告。还有什么可能导致这样的问题?