Возникли проблемы с созданием экземпляра класса C из objective C

#objective-c #objective-c

#objective-c #objective-c

Вопрос:

Я смешиваю 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
 

Ответ №1:

Vtable создается в том же файле, что и первая виртуальная функция класса. В данном случае ~ActorListener() это первый виртуальный метод, потому b2ContactListener::~b2ContactListener() что он виртуальный. Вы не забыли ActorListener::~ActorListener() где-нибудь определить?

Комментарии:

1. Спасибо. Существует очень описательное сообщение, когда вы забываете обычный виртуальный (например, те, которые у меня были ниже), но это очень общее сообщение, если вы забыли деструктор.

Ответ №2:

Хитрость заключается в том, чтобы заставить XCode использовать g для создания ссылок. Вы можете принудительно выполнить это, либо включив исходный файл C в строку ссылки — даже поддельный, по существу пустой — или (я думаю), явно связавшись с /usr/lib/libstdc .6.dylib .

Комментарии:

1. Можете ли вы объяснить, как это сделать более подробно? (новичок в xcode)

2. Буквально просто включение исходного файла с именем fake.cpp в ваш проект containing #define FOO 1 сделает это.