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

标签 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

最佳答案

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

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

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

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

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

关于c++ - g++ 是否有标志可以使这些错误更易于阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35096762/

相关文章:

c++ - 将对象插入队列

c++ - g++ 编译器中的 “Uninitialized use” 警告

c++ - 如何使用动态转换检测到指针的删除

c# - 使用 [StructLayout(LayoutKind.Sequential)] 解码时 C# 在哪里存储结构的 vtable

c++ - 比 memcmp 快

c++ - 有什么方法可以转储 g++ 编译程序的类布局

c# - 将套接字服务器从 Node.js 移植到 C#

c++ - != 运算符应该在类层次结构中的什么地方定义?

c++ - 选择随机子集的通用算法实现

c++ - 编译存储在外部文本文件中的数组(使用命令行g++编译的C++)