我正在将C ++与ObjectiveC混合用于Cocos2d(objective-C)和Box2D(C ++)项目。
我有以下C ++类:
class ActorListener : public b2ContactListener
{
public :
const b2Body* Owner;
ActorListener(const b2Body* owner);
~ActorListener();
virtual void BeginContact(b2Contact* contact);
virtual void EndContact(b2Contact* contact);
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};
我尝试初始化:
(标题中)
ActorListener* Listener;
(mm文件)
Listener = new ActorListener(Body);
我收到错误:
Undefined symbols for architecture i386:
"vtable for ActorListener", referenced from:
ActorListener::ActorListener(b2Body const*)in ActorListener.o
ActorListener::ActorListener(b2Body const*)in ActorListener.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
答案 0 :(得分:4)
vtable与该类的第一个虚函数在同一文件中发出。在这种情况下,~ActorListener()
是第一个虚拟方法,因为b2ContactListener::~b2ContactListener()
是虚拟的。你还记得在某个地方定义ActorListener::~ActorListener()
吗?
答案 1 :(得分:0)
诀窍是让XCode使用g ++来进行链接。您可以通过在链接行上包含C ++源文件来强制执行此操作 - 即使是假的,基本上是空的 - 或者(我认为)通过显式链接/usr/lib/libstdc++.6.dylib来强制执行此操作。