是否有g ++的标志会使这些错误更易于阅读?

时间:2016-01-30 01:01:58

标签: c++ g++ vtable

我遇到了这些C ++链接错误。也许不是专门为为什么发生了这些,但我想知道是否有一些g++标志可能会使这些错误消息更具可读性,例如,它不会这些符号真的有意义:_ZN9_ZTI12+0x10等。

g++ -o src/test.o -c -std=c++11 -Iinclude src/test.cpp
g++ -o observer5 src/test.o
src/test.o: In function `CObserver::CObserver()':
test.cpp:(.text._ZN9CObserverC2Ev[_ZN9CObserverC5Ev]+0xf): undefined reference to `vtable for CObserver'
src/test.o:(.rodata._ZTI12CDisplayHeat[_ZTI12CDisplayHeat]+0x10): undefined reference to `typeinfo for CObserver'
src/test.o:(.rodata._ZTI15CDisplayForcast[_ZTI15CDisplayForcast]+0x10): undefined reference to `typeinfo for CObserver'
src/test.o:(.rodata._ZTI13CDisplayStats[_ZTI13CDisplayStats]+0x10): undefined reference to `typeinfo for CObserver'
src/test.o:(.rodata._ZTI15CDisplayCurrent[_ZTI15CDisplayCurrent]+0x10): undefined reference to `typeinfo for CObserver'
collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:3)

术语" vtable"是"虚拟功能表的缩写。"当编译器为具有虚函数的类生成代码时,它会组装一个包含一堆指向每个多态类的成员函数的指针的表。然后,该表用于非常有效地实现动态调度。

您在这里遇到的错误是链接器错误,表明您的代码编译正确(好!)但链接器无法找到用于实现一个或多个成员函数的编译代码。有一个vtable的类。由于它无法找到这些实现,因此无法生成必要的vtable,因此链接器报告它无法将程序集转换为机器代码。您获得的有关偏移的信息与生成的汇编代码有关,而不是源文件。

要修复此错误,请查看引用的类(此处为CObserver)并检查每个成员函数是否

  1. 在某处定义(并正确编译包含实现的文件)或
  2. 将其标记为纯虚拟(因此没有丢失vtable条目)。
  3. 至于如何让这些更容易阅读 - 我不确定。但是,我已经足够多次看到这个错误了,当我看到它时,我可以立即告诉它是什么问题。我认为通过练习你会进入同一条船。

答案 1 :(得分:1)

我想有人可能会说这些是技术上的链接器错误,但是当我忘记将接口类函数定义为纯虚拟时,我已经看到类似的错误。

例如

class IObserver
{
   virtual void DisplayHeat();
};

而不是

class IObserver
{
   virtual void DisplayHeat() = 0;
};

然后我继承了它

class CObserver : public IObserver
{
....
};

您可以发布代码片段吗?