#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
сделает это.