2012-03-09 89 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的演職員和信號/插槽)。

相關問題