首页 > 后端开发 > C++ > 为什么我在 GCC C 中收到'对虚拟表和构造函数的未定义引用”链接器错误?

为什么我在 GCC C 中收到'对虚拟表和构造函数的未定义引用”链接器错误?

Linda Hamilton
发布: 2024-12-18 08:49:10
原创
435 人浏览过

Why Am I Getting

GCC C 链接器错误:对虚拟表和构造函数的未定义引用

在 C 中,虚拟函数允许派生类覆盖其定义的方法基类。当链接使用虚拟函数的程序时,链接器要求这些方法的定义存在于目标文件中。未能提供这些定义会导致未定义的引用错误,例如:

  • 对 'vtable for XXX' 的未定义引用
  • 对 'ClassName::ClassName()' 的未定义引用

可能原因

这些错误可能因多种原因而发生,包括:

  1. 没有定义的重写虚函数:如前所述,每个虚函数必须具有使用它的最终类中的定义。如果在子类中声明了虚函数但没有定义它,链接器将报告未定义引用错误。
  2. 缺少头文件:包含该类的头文件定义可能未正确包含在使用它们的源文件中。
  3. 库链接不正确:确保您是链接到包含您正在使用的类的实现的正确库。

确认静态库和类可用性

  1. 库位数: 要检查静态库是否为 64 位,请使用以下文件命令:

    file -L <library_path>
    登录后复制

    如果库是 64 位,它应该显示 64 位 x86-64 共享对象。

  2. 类可用性: 使用 objdump -t 命令检查库是否包含特定的class:

    objdump -t <library_path> | grep <class_name>
    登录后复制

    如果该类存在,它将在输出中列出。

示例问题

如提供的错误日志所示,对 SomeClass::close() 的未定义引用表明该类已被使用但尚未定义。同样,对 SomeClass::SomeClass() 和 SomeOtherClass 的 vtable 的未定义引用表明 SomeOtherClass 类的构造函数和虚拟表未在对象文件中定义。

解决方案

要解决此问题,请确保在适当的子类中定义所有虚拟函数,包含所需的头文件,并将正确的库链接到您的节目。

以上是为什么我在 GCC C 中收到'对虚拟表和构造函数的未定义引用”链接器错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板