【问题标题】:can't fix undefined reference to vtable无法修复对 vtable 的未定义引用
【发布时间】:2012-06-12 14:51:23
【问题描述】:

我已经搜索了一段时间,并找到了 很多 涉及我遇到的问题的线程/页面,但我无法找到

  1. 解释为什么会出现这个错误
  2. 针对我的具体案例的可行解决方案

以下是Scanner.h

class BaseReader {

    public:

    virtual ~BaseReader();

    virtual const char* read() = 0;
    virtual long position() = 0;
    virtual long size() = 0;
    virtual void seek(long position) = 0;

};

class CharReader : public BaseReader {

    public:

    CharReader(const char* source);
    CharReader(const char* source, long size);

    ~CharReader();

    const char* read();
    long position();
    long size();
    void seek(long position);

    private:

    char* _source;
    long _position;
    long _size;

};

Scanner.cpp 中,我只是实现了CharReader 的构造函数之一。

我使用 Code::Blocks,但自己编译会导致完全相同的问题。

niklas@emerald:~/git/hiterator (CPP)$ g++ main.cpp hiterator/Scanner.cpp -o main
/tmp/cclNNwgl.o: In function `hiterator::CharReader::CharReader(char const*)':
Scanner.cpp:(.text+0x16): undefined reference to `vtable for hiterator::CharReader'
collect2: ld gab 1 als Ende-Status zurück

@qdii:

#include "Scanner.h"
using namespace hiterator;

#include <stdlib.h>
#include <string.h>

CharReader::CharReader(const char* source) {
    _size = strlen(source);
    _source = (char*) malloc(_size + 1);
    memcpy(_source, source, _size + 1);
}

【问题讨论】:

  • 您也可以粘贴 .cpp 吗?很可能缺少一个虚拟基函数的定义。
  • 好吧,所有的纯虚函数都应该有定义,大部分没有:)

标签: c++ virtual vtable undefined-reference


【解决方案1】:

您的程序不正确。所有的虚函数都被认为是used (odr-used),因此您需要为所有虚函数提供定义。一旦你解决了这个问题,问题就会消失。

编译器抱怨 vtable 不可用。 vtable-s 是一个实现细节,因此不被标准处理,但许多编译器会在定义第一个(非内联)虚函数的翻译单元中生成 vtable。在您的情况下,无论生成 vtable 的标准是什么,您都没有遵守它。

【讨论】:

  • 确实如此。 :o 在CharReader 中实现所有方法后,编译工作正常。谢谢!
【解决方案2】:

查看我在 GCC wiki 上写的内容来解释 undefined reference to vtable for X 错误。

还有很多关于链接器错误的现有问题,我确信其中一个有一个解释它的答案,例如herehere

【讨论】:

    【解决方案3】:

    您在BaseReader 中声明了但没有定义虚拟析构函数。您需要在.cpp 文件中为此提供定义,以便生成BaseReader 的vtable。 CharReader 也一样。

    【讨论】:

    • BaseReader::~BaseReader() { } 添加到 .cpp 文件并不能解决问题。
    • @NiklasR 啊,CharReader。当然,vtable 是为每个类单独生成的。
    • 然后显示undefined reference to read()(适用于所有方法)。但它修复了vtable 的问题,剩下的就很简单了。 :) +1
    • @NiklasR 确实如此,但此错误消息应该是不言自明的。 ;-) 事实上,它只是说如果你真的确实引用了这个函数。
    猜你喜欢
    • 2011-07-27
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多