对vtable的未定义引用

时间:2012-03-09 13:55:38

标签: c++ qt linker-errors vtable

我正在尝试编写一个基本上像indianwebproxy

一样工作的Http代理

所以我启动了qtcreator,但我的一个类无法使用臭名昭着的错误进行编译:{{1​​}}。我无法弄清楚为什么这样做。我在Stackoverflow上阅读了类似的问题,显然是the problem is with undefined virtual methods that are not pure但我没有声明任何虚函数。这是我的班级

undefined reference to vtable for HttpProxyThreadBrowser

我在pastebin中定义了这个课程,以免给你带来烦恼。不幸的是,我无法找出为什么vtable未定义。请协助。

class HttpProxyThreadBrowser : public QThread
{
public:
    HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket  browserSocket,QObject *parent = 0);
    ~HttpProxyThreadBrowser(){};
    void run();

private:
    QTcpSocket outgoingSocket;
    QTcpSocket browserSocket;

};

4 个答案:

答案 0 :(得分:10)

析构函数是隐式的virtual,因为基类有一个虚拟的。

GNU编译器发出vtable以及第一个非内联虚方法(“密钥方法”)。由于你的d'tor是在类中定义的,它是隐式虚拟的,因为没有其他虚拟方法,你没有密钥方法。

没有用例,其中具体类只有虚拟内联方法,因为它们只能内联到派生类中。

我将dtor的定义移到实现文件中。

我不确定你是否也需要在这里使用moc,或者如果QThread衍生物没有使用(IIRC你只需要Qt的强制转换操作符和信号/插槽)。

答案 1 :(得分:7)

我还遇到了undefined reference to vtable错误,并按照Undefined reference to vtable... Q_OBJECT macro中的步骤操作,建议我运行qmake并且......工作正常!

答案 2 :(得分:4)

您无法复制QTcpSocket,因此如果您尝试通过副本而非地址传递它们,则可能会导致其他隐藏错误。

    HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0);

private:
    QTcpSocket* outgoingSocket;
    QTcpSocket* browserSocket;

当您更改头文件时,完全重新编译项目可能会有所帮助,因为生成的qmake Makefile有时无法注意到更改。

答案 3 :(得分:3)

这通常是由于没有链接automoc生成的文件引起的。

首先,您需要在使用Q_OBJECT的类定义的头文件上运行automoc,在您的情况下为“httpproxythreadbrowser.h”。这将生成一个“* .moc”文件。

现在有两种常见的方法可以继续。您可以使用类定义#include .cpp文件末尾的.moc文件,也可以将其作为另一个源文件传递给编译器。