2012-03-09 86 views
5

我想写,基本上就像indianwebproxy未定义引用的vtable为...

HTTP代理所以我解雇了qtcreator和,但我的课之一未能与臭名昭著的错误编译:undefined reference to vtable for HttpProxyThreadBrowser。我无法弄清楚为什么要这样做。我阅读了Stackoverflow上的类似问题,显然the problem is with undefined virtual methods that are not pure但我没有声明任何虚函数。这里是我的类

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

private: 
    QTcpSocket outgoingSocket; 
    QTcpSocket browserSocket; 

}; 

而且我在这里pastebin定义类,所以不会来烦你。不幸的是我无法找出为什么vtable是未定义的。请协助。

httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser 
collect2: ld returned 1 exit status 
+0

根据[文档](http://qt-project.org/doc/qt-4.8/qthread.html#run),run是受保护的成员,不是公共的。我怀疑这会成为你错误的根源。 – obmarg 2012-03-09 14:06:56

+0

@obmarg:这是因为跑步是虚拟的,他从来没有定义过它。 – PlasmaHH 2012-03-09 14:26:05

+0

嗯...我编译得很好。 MinGw上的4.7.4 + 4.8.0。你正在使用哪种OS/Qt版本? – Koying 2012-03-09 14:33:02

回答

4

你不能复制QTcpSocket s,所以如果你试图通过复制而不是地址来传递它,它可能会导致其他的模糊错误。

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

private: 
    QTcpSocket* outgoingSocket; 
    QTcpSocket* browserSocket; 

,完全重新编译您的项目可能会有帮助,当你改变头文件,因为QMAKE产生的Makefile有时会没有注意到的变化。

+1

另一种解决方案是通过引用传递QTcpSocket,即HttpProxyThreadBrowser(QTcpSocket&outgoingSocket,QTcpSocket&browserSocket,QObject * parent = 0); – Koying 2012-03-09 15:07:42

+0

非常感谢你们。但它让我想知道为什么我不能复制QTcpSockets,但这是另一天的故事。 – 2012-03-10 06:57:18

3

这通常是由于未链接自动生成的文件造成的。

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

现在有两种常见的方法如何继续。您可以#include .moc文件在您的.cpp文件末尾添加类定义,或者您可以将它作为其他源文件传递给编译器。

10

因为基类具有虚拟角色,所以析构函数隐含地为virtual

GNU编译器与第一个非内联虚拟方法(“key method”)一起发出vtable。由于你的定义是在类内部定义的,因此它是隐式虚拟的,并且没有其他虚拟方法,所以没有关键方法。

在没有使用情况下,具体类只有虚拟内联方法,因为它们只能内联到派生类中。

我会将dtor的定义移至执行文件。

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

相关问题