2011-06-16 106 views
2

我的代碼:QT錯誤:未定義參考`虛表的主題」

#include <iostream> 
#include <QThread> 
#include <unistd.h> 
#include <stdlib.h> 
#include <QApplication> 


using std::cerr; 
using std::endl; 

class Thread : public QThread 
{ 
    Q_OBJECT 
public: 
    Thread(); 
    ~Thread(); 
    void setMessage(const QString &_message); 
    void stop(); 
protected: 
    void run(); 
private: 
    QString message; 
    volatile bool stopped; 
}; 

Thread::Thread() 
{ 
    stopped = false;  
    run(); 
} 

Thread::~Thread() 
{ 

} 


void Thread::run() 
{ 
    while(!stopped){ 
     cerr << qPrintable(message); 
     sleep(1); 
    } 
     stopped = false; 
     cerr << endl; 
} 

void Thread::stop() 
{ 
    stopped = true; 
} 

void Thread::setMessage(const QString &_message) 
{ 
    message = _message; 
} 

int main(int argc,char *argv[]) 
{ 
    QApplication app(argc, argv); 
    Thread *A,*B; 
    A = new Thread(); 
    B = new Thread(); 
    A->setMessage("Thread A\n"); 
    B->setMessage("Thread B\n"); 
//.run(); 
//.run(); 
    sleep(10); 
    A->stop(); 
    B->stop(); 
    return 0; 
} 

,我有錯誤

g++ -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-O1 -o tmp main.o -L/usr/lib -lQtGui -lQtCore -lpthread 
main.o: In function `Thread::~Thread()': 
main.cpp:(.text+0xa): undefined reference to `vtable for Thread' 
main.o: In function `Thread::Thread()': 
main.cpp:(.text+0x1da): undefined reference to `vtable for Thread' 
collect2: ld returned 1 exit status 
make: *** [tmp] Error 1 
+1

複製到此:http://stackoverflow.com/questions/1095298/gcc-c-linker-errors-undefined-reference-to-vtable-for-xxx-undefined-referen – littleadv 2011-06-16 06:07:12

+2

@littleadv:該問題doesn'並沒有真正談到在這裏使用的Qt Framework構建環境中需要解決的具體問題。 – 2011-06-16 08:21:56

+1

[Undefined reference to vtable。試圖編譯一個Qt項目](http://stackoverflow.com/questions/1552069/undefined-reference-to-vtable-trying-to-compile-a-qt-project) – 2011-06-16 18:30:16

回答

6

你必須在你的源文件底部的一行:

#include "main.moc" 

這是因爲class Thread的聲明不是在頭 - 這是在.cpp文件。所以默認moc不會在其上運行。添加行做了兩兩件事:

  • 它標誌着以qmakemocmoc必須處理.cpp文件
  • 它會導致該moc產生要由編譯步驟
拉的東西

因此,添加該行後,您需要重新運行qmake,以便它可以更新makefile以生成main.moc

通常,moc針對頭文件運行,並創建包含在構建中的.cpp文件(qmake見此)。這個'技巧'導致moc也被運行在問題的.cpp文件中(並且編譯了moc生成的代碼)。

於包括main.mocmain.cpp結束的替代方法是的class Thread定義移動到.H頭文件和#include這一點。如果定義在標題qmakemoc應自動處理事情。

-1

簡單地將字符串添加到.pro文件。這是幫助我在同樣的問題

INSTALLS += target 

請參閱queudcustomtype示例。

+0

這似乎並沒有回答這個問題。 – zett42 2017-03-27 01:33:12