2011-02-01 196 views
1

我已閱讀常見問題和其他幾個網站,但我似乎無法找到合適的解決方案。我確信你之前已經聽到過這個問題,如果可能的話,我想問一下我應該如何解決這個問題。如何正確解決「未定義的vtable引用」錯誤?

具體的錯誤是: 錯誤:未定義的引用到`FGUI的FGUI' 它始終指向fgui.cpp中的構造函數,但我沒有看到任何可能是錯誤的。

FGui是從名爲「FFoo」的類繼承的類,它從QMainWindow繼承。 相關代碼:

(在ffoo.h :)

class Ffoo : public QMainWindow 
{ 
Q_OBJECT 
public: 
    Ffoo(); 
    ~Ffoo(); 
    (...) 
}; 

(在ffoo.cpp :)

Ffoo::Ffoo() 
{ 
    textEdit = 0; 
    tcpSock = 0; 
    setupConnectBox(); 
} 

Ffoo::~Ffoo() 
{} 

的FGUI文件仍然很平淡,因爲我纔開始製作最近上課。

(fgui.h :)

class FGui : public Ffoo 
{ 
    Q_OBJECT 
public: 
    FGui(); 
    ~FGui(); 
}; 

(fgui.cpp :)

FGui::FGui() : Ffoo() 
{} 

FGui::~FGui() 
{} 

如果有人能告訴我怎樣做才能解決這個問題,我將非常感激。提前致謝。 :)

+1

問題可能與構造函數無關。構造函數必須將對象鏈接到vtable,就是這樣。問題很可能在其他代碼中。我也沒有看到你的構造函數有問題。 – 2011-02-01 16:22:28

回答

3

您需要moc FGui和Ffoo類。

+0

是的,最有可能是問題 – 2011-02-01 16:23:55

+2

啊是兩個階段編譯的樂趣......我不喜歡QT的唯一的東西。 – AJG85 2011-02-01 16:26:26

5

嘗試重新運行qmake。如果你使用Qt Creator,clean項目(Build/Clean All),然後選擇Build/Run qmake。這通常有助於這種情況。

2

對vtable的未定義引用意味着您沒有實現純虛擬方法。正如其他人所說的,它可能是Ffoo中的一個純粹的虛擬方法,您忘記在FGui中實現,或者如果您使用的是信號,也許您沒有使用元對象編譯器(將實現缺失的方法)。

3

您需要對您的源文件運行moc。如果您使用qmake創建了makefile,只要將.cpp和.h文件包含在.pro文件中,就會自動發生。您可能忘記了其中一個步驟。請注意,如果您的類在上次運行qmake期間不包含Q_OBJECT宏,則只需運行make不會調用moc來運行。你需要再次運行qmake這樣做!

然後會發生什麼是以下過程:如果運行「make」,不僅會編譯您的.cpp文件,還會通過moc(元對象編譯器)創建一個附加的.cpp文件,然後進行編譯。第二個.cpp文件包含信號的實現。請注意,信號是將呼叫「轉發」到所連接的插槽(或信號)的非常普通的方法。這個實現是moc生成的(除其他之外)。即使你的類不包含信號,由於某些內部使用的(?)虛函數,這些類需要有一個vtable。但是,如果你的源文件包含一個基於QObject的類,moc確實需要運行。

2

當您在源文件開發的最後階段添加Q_OBJECT宏時,通常會得到這個結果。Makefile還不認爲你必須moc文件,所以它不會,並且你得到這些vtable錯誤。正如其他人所指出的,只需重新運行qmake即可。如果您使用的是Creator,它位於Build菜單下。

相關問題