- Qt 出現(xiàn)“undefined reference to `vtable for”原因總結(jié);
由于Qt本身實(shí)現(xiàn)的機(jī)制所限,,我們?cè)谑褂肣t制作某些軟件程式的時(shí)候,,會(huì)遇見各種各樣這樣那樣的問題,,而且非常多是非常難,或根本未找到原因的,,即使解決了問題,,如果有人問你為什么,你只能回答--不知道;
今天我在這里列舉的問題也是再編寫Qt程式時(shí),,總是遇見的問題,,問題普遍,而答案卻不唯一,,解釋這一個(gè)問題的說法非常多,,往往只適合某一種情況,因?yàn)檫@個(gè)
錯(cuò)誤太籠統(tǒng)了,,他就是-- “undefined reference to `vtable
for”可能你看著非常熟悉,,似乎在c++程式中也遇見過這個(gè)問題,你說對(duì)了,,有時(shí)候這個(gè)錯(cuò)誤,,不只是qt的原因,更有你的c++程式的原因,;
下面搜集了網(wǎng)上的一些出現(xiàn)的現(xiàn)象,,對(duì)應(yīng)解決方法,原因,,基本上我都驗(yàn)證過,,收錄于此,以做備份,;
一:
預(yù)編譯器打開宏Q_OBJECT,,聲明若干個(gè)由moc處理(implement)的成員函數(shù)。如果得到類似于“undefined reference
to vtable for LcdNumber”的編譯錯(cuò)誤(if you get compiler errors along the
lines of "undefined reference to vtable for
LcdNumber"),,你可能是忘記了執(zhí)行moc,,或忘記了將moc輸出加入到link命令里。
某一個(gè)類中如果加入Q_OBJECT后,則link時(shí)提示:undefined reference to vtable for "xxx::xxx".刪掉他則沒有所有問題.
解決:嘗試(1):把所有的obj文件和uic文件刪除,重新編譯.仍然失敗.
去trolltech的mail lists找到原因: 因?yàn)閝make生成Makefile的時(shí)候,這個(gè)類的頭文件中并沒有Q_OBJECT,所以在相應(yīng)的Makefile里面并沒有用moc xxx.h命令,最終導(dǎo)致鏈接失敗.重新運(yùn)行qmake,問題解決.
在查找解決方法的時(shí)候,附帶發(fā)現(xiàn)一點(diǎn):
qmake 不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有他的話,也會(huì)產(chǎn)生undefined reference to
vtable for "xxx::xxx". 這時(shí),需要先用moc
xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題.
這里能發(fā)現(xiàn)問題的出現(xiàn)是因?yàn)闆]有moc生成相應(yīng)的moc文件,,之后連接就出問題,。
我找了好多源碼之類的問題,就是沒有找pro的錯(cuò)誤,,后來想到qt中moc我們是有make做的
qt的make編譯是根據(jù)Makefile來的,,而Makefile是由pro文件來的。這才想到了找pro文件的錯(cuò)誤,。
from: http://www./u/16292/showart_136087.html
二:
undefined reference to vtable for "xxx::xxx"
今天碰到了這個(gè)問題,,終于被我google到了:
http://www./opera/showart.php?blogid=8650&id=49526
原 因:qmake不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有他的話,也會(huì)產(chǎn)生undefined reference
to vtable for "xxx::xxx". 這時(shí),需要先用moc
xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題.
其他:
1.問題: QGLViewer中的函數(shù)不能正常link.解決: 翻看其原始碼,發(fā)現(xiàn)是因?yàn)閺脑创a安裝libQGLViewer時(shí),編譯用了Qt
3,而我的程式中用Qt4 編譯.所以必須重新用Qt4編譯.不過,更改QTDIR
環(huán)境變量為Qt4后,重新編譯的話,qmake生成makefile時(shí)就提示出錯(cuò).進(jìn)一步發(fā)現(xiàn),是因?yàn)殡m然設(shè)了QTDIR為Qt4,頭文件和庫文件都會(huì)使
用Qt4,不過moc,uic等都是用的qt3版的,再把PATH環(huán)境變量改動(dòng)后,一切ok.
2.問題:某一個(gè)類中如果加入Q_OBJECT后, 則link時(shí)提示:undefined reference to vtable for
"xxx::xxx".刪掉他則沒有所有問題.解決:嘗試(1):把所有的obj文件和uic文件刪除,重新編譯.仍然失敗.去trolltech的
mail lists找到原因:
因?yàn)閝make生成Makefile的時(shí)候,這個(gè)類的頭文件中并沒有Q_OBJECT,所以在相應(yīng)的Makefile里面并沒有用moc
xxx.h命令,最終導(dǎo)致鏈接失敗.重新運(yùn)行qmake,問題解決.在查找解決方法的時(shí)候,附帶發(fā)現(xiàn)一點(diǎn):qmake
不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有他的話,也會(huì)產(chǎn)生undefined reference to
vtable for "xxx::xxx". 這時(shí),需要先用moc
xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題.
3. 看Qt的reference發(fā)現(xiàn): 能connect(pObjA,
SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));這樣pObjA發(fā)出的someSingalA
會(huì)導(dǎo)致pObjB發(fā)出someSignalB,從而形成信號(hào)接力.
|