只在库cpp中有定义的前向声明结构

Forward-declare struct which only has definition in a library cpp

本文关键字:声明 结构 定义 cpp      更新时间:2023-10-16

我使用的是子弹3物理库,它在其中一个cpps中有以下结构定义:

struct btSingleContactCallback : public btBroadphaseAabbCallback
{
    btCollisionObject* m_collisionObject;
    btCollisionWorld*   m_world;
    btCollisionWorld::ContactResultCallback&    m_resultCallback;

    btSingleContactCallback(btCollisionObject* collisionObject, btCollisionWorld* world,btCollisionWorld::ContactResultCallback& resultCallback)
        :m_collisionObject(collisionObject),
        m_world(world),
        m_resultCallback(resultCallback)
    {
    }
    virtual bool    process(const btBroadphaseProxy* proxy)
    {
        btCollisionObject*  collisionObject = (btCollisionObject*)proxy->m_clientObject;
        if (collisionObject == m_collisionObject)
            return true;
        //only perform raycast if filterMask matches
            if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) 
        {
            btCollisionObjectWrapper ob0(0,m_collisionObject->getCollisionShape(),m_collisionObject,m_collisionObject->getWorldTransform(),-1,-1);
            btCollisionObjectWrapper ob1(0,collisionObject->getCollisionShape(),collisionObject,collisionObject->getWorldTransform(),-1,-1);
            btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0,&ob1);
            if (algorithm)
            {
                btBridgedManifoldResult contactPointResult(&ob0,&ob1, m_resultCallback);
                //discrete collision detection query
                algorithm->processCollision(&ob0,&ob1, m_world->getDispatchInfo(),&contactPointResult);
                algorithm->~btCollisionAlgorithm();
                m_world->getDispatcher()->freeCollisionAlgorithm(algorithm);
            }
        }
        return true;
    }
};

问题是,结构体从未在任何头文件中声明,我需要能够创建这种类型的对象。项目符号库是静态链接的,因此我认为我应该能够在主程序中自己声明它,如下所示:

struct btSingleContactCallback
    : public btBroadphaseAabbCallback
{
    btCollisionObject *m_collisionObject;
    btCollisionWorld *m_world;
    btCollisionWorld::ContactResultCallback &m_resultCallback;
    btSingleContactCallback(btCollisionObject *collisionObject,btCollisionWorld *world,btCollisionWorld::ContactResultCallback &resultCallback);
    virtual bool process(const btBroadphaseProxy *proxy);
};

这实际上工作得很好,只要我在调试模式下编译。但是,当尝试在发布模式下编译时,我得到一个无法解析的符号错误:

physenvironment.obj : error LNK2001: unresolved external symbol "public: __cdecl btSingleContactCallback::btSingleContactCallback(class btCollisionObject *,class btCollisionWorld *,struct btCollisionWorld::ContactResultCallback &)" (??0btSingleContactCallback@@QEAA@PEAVbtCollisionObject@@PEAVbtCollisionWorld@@AEAUContactResultCallback@2@@Z)

这可能与c++的名称混淆有关吗?有没有一种方法可以避免它,而不必在库本身进行修改?

从五分钟的库代码来看,您实际上应该使用ContactResultCallback,它是公共的,让btCollisionWorld::contactTest的实现为您创建和使用私有的btSingleContactCallback

您没有实现构造函数。