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?
Ответы
Ответ 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, вы можете использовать этот флаг. Надеюсь, это поможет.