调试 GCC 中的 vtable 链接器错误

发布于 2024-08-20 03:12:33 字数 199 浏览 8 评论 0原文

当使用 GCC 时,我时不时地会遇到这样的神秘错误:

undefined reference to 'vtable for classname'

当它不是由缺少库引起时,这个描述性不太强的错误消息总是让我逐行挖掘代码文件找到虚函数缺少的实现。有没有办法让链接器告诉我它缺少哪个虚拟函数,也许是一个标志或其他东西?或者它可能告诉我但我不明白它在说什么?

Now and then when using GCC I get cryptic errors like this:

undefined reference to 'vtable for classname'

When it's not caused by a missing library, this not-very-descriptive error message always causes me to dig through code files line by line to find the missing implementation for a virtual function. Is there a way to make the linker tell me which virtual function it is missing, perhaps a flag or something? Or is it maybe telling me but I don't understand what it's saying?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贱人配狗天长地久 2024-08-27 03:12:33

来自 gcc 常见问题解答

构建 C++ 时,链接器显示我的
构造函数、析构函数或虚拟函数
表未定义,但我定义了
他们

ISO C++ 标准规定
类的所有虚方法
不是纯虚拟的,必须定义,
但不需要任何诊断
对于违反本规则的行为
[类.虚拟]/8。基于此
假设,GCC 只会发出
隐式定义的构造函数,
赋值运算符、析构函数
和一个类的虚拟表
定义其的翻译单元
第一个这样的非内联方法。

因此,如果您未能定义此
特定的方法,链接器可以
抱怨缺乏定义
对于明显不相关的符号。
不幸的是,为了改进
这个错误信息,可能是
需要更改链接器,并且
这并不总是能做到。

解决方案是确保所有
非纯虚方法是
定义的。请注意,析构函数必须
即使已声明也已定义
纯虚拟 [class.dtor]/7。

我采用的解决方案是搜索类名并查找虚拟方法声明并检查是否有定义。我没有找到任何其他解决方案。

From gcc faq:

When building C++, the linker says my
constructors, destructors or virtual
tables are undefined, but I defined
them

The ISO C++ Standard specifies that
all virtual methods of a class that
are not pure-virtual must be defined,
but does not require any diagnostic
for violations of this rule
[class.virtual]/8. Based on this
assumption, GCC will only emit the
implicitly defined constructors, the
assignment operator, the destructor
and the virtual table of a class in
the translation unit that defines its
first such non-inline method.

Therefore, if you fail to define this
particular method, the linker may
complain about the lack of definitions
for apparently unrelated symbols.
Unfortunately, in order to improve
this error message, it might be
necessary to change the linker, and
this can't always be done.

The solution is to ensure that all
virtual methods that are not pure are
defined. Note that a destructor must
be defined even if it is declared
pure-virtual [class.dtor]/7.

The solution that I adopt is search the classname and seek virtual methods declaration and check if there is any definition. I didn't found any other solution for this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文