未定义的符号“vtable for …”和“typeinfo for …”?

几乎最后一步,但仍然有一些奇怪的erros ….

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有什么意义?

如果Obstacle是一个抽象的基类,那么确定你声明了所有的虚拟方法“纯虚拟”:

 virtual void Method() = 0; 

= 0告诉编译器,这个方法必须被派生类覆盖,并且可能没有自己的实现。

如果类包含任何非纯虚函数,那么编译器会假设它们有某个实现,其内部结构(vtable和typeinfo)可能会在与其中的一个相同的目标文件中生成; 如果这些function没有实现,那么内部结构将会丢失,你会得到这些错误。

Obstacle类需要一个虚拟析构函数。 将析构函数定义为:

 virtual ~Obstacle(); 

析构函数的定义也为具有虚函数的类创build了vtable。 它还确保通过基类指针删除派生类实例是正确的。

(我的问题答案的副本我该怎么处理这个奇怪的错误?这似乎是重复的)

你有Obstacle.cc文件吗? 如果是这样,你需要确保它被内置到Obstacle.o ,并且当你链接你的程序时, Obstacle.o会被添加到命令行中。

另外,确保你定义了你声明的所有非纯虚方法。 如果你声明一个纯粹的虚拟析构函数,你也需要定义它。

vtable和typeinfo是由C ++编译器生成的内部结构。 vtable用于调用虚拟函数,typeinfo用于RTTI。

不同的编译器在生成这些结构时有不同的策略。 我看到的一个策略是他们将在同一个对象文件中生成包含类中第一个虚函数的表。

还有另一个原因,你可以得到这个错误,只是想在这里logging它。 我正在连接一个没有RTTI的静态库。 所以使用C ++标志-fno-rtti修正了我。 如果你不需要RTTI,你也可以使用这个标志。 希望这可以帮助。

Interesting Posts