天天看點

undefined reference to `vtable for XXX '

一:

預編譯器打開宏Q_OBJECT,聲明若幹個由moc處理(implement)的成員函數。如果得到類似于“undefined reference to vtable for LcdNumber”的編譯錯誤(if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber"),你可能是忘記了執行moc,或者忘記了将moc輸出加入到link指令裡。

某一個類中如果加入Q_OBJECT後,則link時提示:undefined reference to vtable for "xxx::xxx".删掉它則沒有任何問題.

解決:嘗試(1):把所有的obj檔案和uic檔案删除,重新編譯.仍然失敗.

去trolltech的mail lists找到原因: 因為qmake生成Makefile的時候,這個類的頭檔案中并沒有Q_OBJECT,是以在相應的Makefile裡面并沒有用moc xxx.h指令,最終導緻連結失敗.重新運作qmake,問題解決.

在查找解決方法的時候,附帶發現一點:

qmake 不會處理.cpp檔案裡的Q_OBJECT,是以,如果在.cpp檔案中有它的話,也會産生undefined reference to vtable for "xxx::xxx". 這時,需要先用moc xxxx.cpp生成相應的moc檔案,再包含到.cpp裡面去,才能解決這個問題.

這裡可以發現問題的出現是因為沒有moc生成相應的moc檔案,之後連接配接就出問題。

我找了好多源碼之類的問題,就是沒有找pro的錯誤,後來想到qt中moc我們是有make做的

qt的make編譯是根據Makefile來的,而Makefile是由pro檔案來的。這才想到了找pro檔案的錯誤。

from: http://www.cublog.cn/u/16292/showart_136087.html

二:

undefined reference to vtable for "xxx::xxx"

今天碰到了這個問題,終于被我google到了:

http://www.cublog.cn/opera/showart.php?blogid=8650&id=49526

原 因:qmake不會處理.cpp檔案裡的Q_OBJECT,是以,如果在.cpp檔案中有它的話,也會産生undefined reference to vtable for "xxx::xxx". 這時,需要先用moc xxxx.cpp生成相應的moc檔案,再包含到.cpp裡面去,才能解決這個問題.

其他:

1.問題: QGLViewer中的函數不能正常link.

解決: 翻看其源代碼,發現是因為從源碼安裝libQGLViewer時,編譯用了Qt 3,而我的程式中用Qt4 編譯.是以必須重新用Qt4編譯.但是,更改QTDIR 環境變量為Qt4後,重新編譯的話,qmake生成makefile時就提示出錯.進一步發現,是因為雖然設了QTDIR為Qt4,頭檔案和庫檔案都會使 用Qt4,但是moc,uic等都是用的qt3版的,再把PATH環境變量改動後,一切ok.

2.問題:某一個類中如果加入Q_OBJECT後, 則link時提示:undefined reference to vtable for "xxx::xxx".删掉它則沒有任何問題.

解決:嘗試(1):把所有的obj檔案和uic檔案删除,重新編譯.仍然失敗.去trolltech的 mail lists找到原因: 因為qmake生成Makefile的時候,這個類的頭檔案中并沒有Q_OBJECT,是以在相應的Makefile裡面并沒有用moc xxx.h指令,最終導緻連結失敗.重新運作qmake,問題解決.在查找解決方法的時候,附帶發現一點:

qmake 不會處理.cpp檔案裡的Q_OBJECT,是以,如果在.cpp檔案中有它的話,也會産生undefined reference to vtable for "xxx::xxx". 這時,需要先用moc xxxx.cpp生成相應的moc檔案,再包含到.cpp裡面去,才能解決這個問題.

3. 看Qt的reference發現: 可以connect(pObjA, SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));這樣pObjA發出的someSingalA 會導緻pObjB發出someSignalB,進而形成信号接力.

from:http://blog.donews.com/netexe/archive/2006/02/09/720544.aspx

三:

編譯報錯的部分是:

CODE: 

[Copy to clipboard] 

tmp/obj/release_shared/myplot.o(.text+0x194):myplot.cpp: undefined reference to

`vtable for MyPlot'

tmp/obj/release_shared/myplot.o(.text+0x19b):myplot.cpp: undefined reference to

`vtable for MyPlot'

tmp/obj/release_shared/myplot.o(.text+0x934):myplot.cpp: undefined reference to

`vtable for MyPlot'

tmp/obj/release_shared/myplot.o(.text+0x93b):myplot.cpp: undefined reference to

`vtable for MyPlot'

collect2: ld returned 1 exit status你 MyPlot 是不是聲明了什麼 virtual 的 方法, 但在實作(cpp)檔案裡沒有實作。

看了一下, 現在推測一下。 MyPlot 繼承了 QwtPlot, 現在報的這個錯, 應該是這個意思,

1. QwtPlot 裡含有 vritual 方法, 是以你的繼承類需要一個 virtual 的析構函數

2. QwtPlot 裡含有 純虛的方法, 你沒有繼承, 而這個可能性比較小

是以, 你可以:

在MyPlot裡聲明一下一個虛的析構函數

virtual ~MyPlot() {}

我們來看一個簡單些的例子吧:

CODE: 

[Copy to clipboard] 

#include <qapplication.h>

#include <qpushbutton.h>

class myWidget :public QWidget

{

Q_OBJECT

public:

       myWidget(QWidget *parent = 0);

public slots:

       void shutDown();

private:

        QPushButton *exit;

};

myWidget::myWidget(QWidget *parent):QWidget(parent)

{

     setMinimumSize(120, 180);

     setMaximumSize(120, 180);

     exit = new QPushButton("ShutDown!",this);

     connect(exit,SIGNAL(clicked()),this,SLOT(shutDown()));

}

void myWidget::shutDown()

{

     system("halt");

}

int main(int argc, char **argv)

{

    QApplication app(argc, argv);

    myWidget *w = new myWidget();

    w->show();

    app.exec();

}還是報錯:

CODE: 

[Copy to clipboard] 

shut.o(.text+0x21): In function `myWidget::myWidget[not-in-charge](QWidget*, char const*)':

: undefined reference to `vtable for myWidget'

shut.o(.text+0x28): In function `myWidget::myWidget[not-in-charge](QWidget*, char const*)':

: undefined reference to `vtable for myWidget'

shut.o(.text+0x141): In function `myWidget::myWidget[in-charge](QWidget*, char const*)':

: undefined reference to `vtable for myWidget'

shut.o(.text+0x148): In function `myWidget::myWidget[in-charge](QWidget*, char const*)':

: undefined reference to `vtable for myWidget'

collect2: ld returned 1 exit status這是我從l搜尋引擎上搜到的例子,從代碼中好像看不到明顯的錯誤吧

我自己試了一下編譯也是出錯

剛才那個簡單的例子的原因可能是這樣的:

QUOTE: 

2.問題:某一個類中如果加入Q_OBJECT後,則link時提示:undefined reference to vtable for "xxx::xxx".删掉它則沒有任何問題.

解決:嘗試(1):把所有的obj檔案和uic檔案删除,重新編譯.仍然失敗.

去trolltech的mail lists找到原因: 因為qmake生成Makefile的時候,這個類的頭檔案中并沒有Q_OBJECT,是以在相應的Makefile裡面并沒有用moc xxx.h指令,最終導緻連結失敗.重新運作qmake,問題解決.

在查找解決方法的時候,附帶發現一點:

qmake不會處理.cpp檔案裡的Q_OBJECT,是以,如果在.cpp檔案中有它的話,也會産生undefined reference to vtable for "xxx::xxx". 這時,需要先用moc xxxx.cpp生成相應的moc檔案,再包含到.cpp裡面去,才能解決這個問題.知道你的問題了, 上面的例子不好, 因為你這個把main和類放在一起了。 如果分開, 可能就沒問題, 包括 h和 cpp 分開。

要解決上面的問題, 在你main.cpp 最後加一行

#include "main.moc"

然後把除了 main.cpp 的其它檔案都删了。重新來, 沒問題的。

是以, 我估計你前面提到的問題也是沒有連結 moc 檔案。 你在你的 myplot.cpp 檔案最後加一行: #include "myplot.moc" 試試看。

另外: 你main 沒有傳回值, 編譯會警告, 而且程式最後一行不是隻含有回車, 也會警告。

繼續閱讀