我正在尝试编写一个基本上像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;
};
答案 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文件,也可以将其作为另一个源文件传递给编译器。