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

Are there flags for g++ that will make these errors easier to read?

我遇到了这些 C++ link 错误。也许不是专门针对 为什么 这些发生,但我想知道是否有一些 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

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

例如

class IObserver
{
   virtual void DisplayHeat();
};

而不是

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

后来我继承了它

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

你能 post 你的代码片段吗?

术语"vtable"是"virtual function table."的缩写当编译器为具有虚函数的classes生成代码时,它会组装一个包含一堆指针的table每个多态的成员函数 class。这个table然后被用来极其高效地实现动态调度。

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

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

  1. 在某处定义它(并正确编译包含实现的文件),或
  2. 将其标记为纯虚拟(因此不会丢失 vtable 条目)。

至于如何使这些更易于阅读 - 我不确定。但是,我已经看到这个错误很多次了,以至于当我看到它时我可以立即判断出问题所在。我认为通过练习你会陷入同一条船。