我遇到了这些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
答案 0 :(得分:3)
术语" vtable"是"虚拟功能表的缩写。"当编译器为具有虚函数的类生成代码时,它会组装一个包含一堆指向每个多态类的成员函数的指针的表。然后,该表用于非常有效地实现动态调度。
您在这里遇到的错误是链接器错误,表明您的代码编译正确(好!)但链接器无法找到用于实现一个或多个成员函数的编译代码。有一个vtable的类。由于它无法找到这些实现,因此无法生成必要的vtable,因此链接器报告它无法将程序集转换为机器代码。您获得的有关偏移的信息与生成的汇编代码有关,而不是源文件。
要修复此错误,请查看引用的类(此处为CObserver
)并检查每个成员函数是否
至于如何让这些更容易阅读 - 我不确定。但是,我已经足够多次看到这个错误了,当我看到它时,我可以立即告诉它是什么问题。我认为通过练习你会进入同一条船。
答案 1 :(得分:1)
我想有人可能会说这些是技术上的链接器错误,但是当我忘记将接口类函数定义为纯虚拟时,我已经看到类似的错误。
例如
class IObserver
{
virtual void DisplayHeat();
};
而不是
class IObserver
{
virtual void DisplayHeat() = 0;
};
然后我继承了它
class CObserver : public IObserver
{
....
};
您可以发布代码片段吗?