Как найти неопределенные виртуальные функции класса - PullRequest
2 голосов
/ 07 сентября 2010

Я портирую игру с windows на mac.

Здесь я застрял с кучей ошибок компоновщика. Все ошибки похожи на

Неопределенные символы "typeinfo для базового класса", на которые ссылается: typeinfo для подкласса. Subclass.o or "vtable для Aclass, на которые ссылается _ZTVNAclass:`

Я знаю, что проблема из-за отсутствия определения виртуальных функций. Его большой проект и трудно отследить неопределенные виртуальные функции. Есть ли у них какой-либо способ быстро идентифицировать неопределенные виртуальные функции.

Почему компилятор не может определить неопределенные виртуальные функции и дать значимое сообщение вместо загадочного сообщения vtable.

Минимальный пример: -

class Foo
{  
public:  
  virtual ~Foo(){};  
  virtual void  someMethod();  
};

int main()
{
    Foo  foo;
    return 0;
}

И g ++ версии 4.2.1 (Apple Inc., сборка 5664) говорит: -

Undefined symbols:  
  "vtable for Foo", referenced from:  
      Foo::Foo()   in ccj8yYI2.o  
ld: symbol(s) not found  
collect2: ld returned 1 exit status  

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Я полагаю, что обе эти ошибки означают, что у класса есть виртуальные функции, но нет не встроенных виртуальных функций (это легко сделать, если вы пришли, скажем, из Java).GCC испускает vtable и (я полагаю) typeinfo, когда он испускает первую не встроенную виртуальную функцию в классе.Если все ваши виртуальные функции встроены, эти биты не будут сгенерированы.

Вам необходимо переместить встроенную виртуальную функцию в исходный файл и сделать ее не встроенной.Деструктор часто является хорошим кандидатом.

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял ваш вопрос.Как насчет временно сделать ваши виртуальные функции не виртуальными, чтобы компоновщик испускал отсутствующий символ для этой точной функции, а не для vtable?Вы, очевидно, должны были бы помнить, чтобы ревиртуализировать их позже.

EDIT2: Когда я пытался скомпилировать это, я получил описательную ошибку.Можете ли вы вставить минимальный пример, который не подходит?

class Foo
{
public:
    virtual ~Foo();
};

int main()
{
    Foo foo;

    return 0;
}

Вывод:

Undefined                       first referenced
 symbol                             in file
Foo::~Foo()                         /var/tmp//cc4C2j6B.o
vtable for Foo                      /var/tmp//cc4C2j6B.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
1 голос
/ 15 марта 2012

Я столкнулся с подобной проблемой. В конце я временно использовал clang вместо gcc, что давало гораздо лучшие сообщения об ошибках:

code.cpp:103:20: fatal error: allocating an object of abstract class type 'MyClass'
    instance = new MyClass();
                   ^
code.h:766:16: note: unimplemented pure virtual method 'ForgottenVirtualMethod' in 'MyClass'
  virtual void ForgottenVirtualMethod(int x, int y) = 0;
               ^
1 error generated.
0 голосов
/ 07 сентября 2010

Первая проблема обычно возникает, когда класс BaseClass не является полиморфным.Убедитесь, что у него есть хотя бы одна виртуальная функция (для этого подойдет виртуальный деструктор).

Для проблемы с AClass убедитесь, что имеется файл .cpp, в котором определены виртуальные методы Aclass,Убедитесь, что они не определены в заголовочном файле.К сожалению, для этого не будет никакого магического инструмента, по крайней мере, насколько я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...