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

时间:2015-08-11 13:55:38

标签: c++ struct static-libraries forward-declaration unresolved-external

我正在使用bullet 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 ++的名称修改有什么关系吗?有没有办法避免它,而不必开始在库本身进行修改?

2 个答案:

答案 0 :(得分:2)

从五分钟看图书馆代码,您实际应该使用公开的ContactResultCallback,让btCollisionWorld::contactTest的实施为您创建并使用私有btSingleContactCallback

答案 1 :(得分:-1)

您没有实现构造函数。

相关问题