Подтвердить что ты не робот

Undefined символы "vtable for..." и "typeinfo for..."?

Почти последний шаг, но все же некоторые странные эры....

bash-3.2$ make
g++ -Wall -c -g Myworld.cc
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem
Undefined symbols:
  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [solvePlanningProblem] Error 1

Что означает значение vtable и typeinfo?

4b9b3361

Ответ 1

Если Obstacle является абстрактным базовым классом, убедитесь, что вы объявляете все его виртуальные методы "чистым виртуальным":

virtual void Method() = 0;

= 0 сообщает компилятору, что этот метод должен быть переопределен производным классом и может не иметь собственной реализации.

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

Ответ 2

Для класса Obstacle нужен виртуальный деструктор. Измените определение деструктора следующим образом:

virtual ~Obstacle();

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

(копия моего ответа на вопрос Что мне делать с этой странной ошибкой?, которая кажется дублирующей.)

Ответ 3

У вас есть файл Obstacle.cc? Если это так, вам нужно убедиться, что он встроен в Obstacle.o, и что Obstacle.o добавляется в командную строку при связывании вашей программы.

Кроме того, убедитесь, что вы определяете все нечисто-виртуальные методы, которые вы объявляете. Если вы объявляете чистый виртуальный деструктор, вам также нужно определить это.

Ответ 4

vtable и typeinfo - это внутренние структуры, сгенерированные компилятором С++. vtable используется для вызова virtuable функций и typeinfo используется для RTTI.

У разных компиляторов есть разные стратегии, когда они генерируют эти структуры. Одна из стратегий, которую я видел, это генерация таблицы в том же объектном файле, который содержит первую виртуальную функцию в классе.

Ответ 5

Есть еще одна причина, по которой вы можете получить эту ошибку, и просто хотите документировать ее здесь. Я связывался со статической библиотекой, у которой не было RTTI. Поэтому использование флага С++ -fno-rtti исправлено для меня. Если вам не нужен RTTI, вы можете использовать этот флаг. Надеюсь, это поможет.