Qt編譯出錯:undefined reference to `vtable for XXX'

前提

在一個已編譯的Qt項目中添加了一個類,該類未繼承QObject且未在頭文件添加Q_OBJECT,如下:

//MySignalSlot.h文件
#ifndef MYSIGNALSLOT_H
#define MYSIGNALSLOT_H

class MySignalSlot
{
public:
    MySignalSlot();
};

#endif // MYSIGNALSLOT_H

若此時想使用Qt的信號槽通信機制,則需要添加QObject頭文件,繼承QObject,並在頭文件中添加Q_OBJECT;如下所示:

#ifndef MYSIGNALSLOT_H
#define MYSIGNALSLOT_H

#include <QObject>

class MySignalSlot : public QObject
{
    Q_OBJECT
public:
    MySignalSlot();
};

#endif // MYSIGNALSLOT_H

此時編譯程序,就會報錯:

undefined reference to `vtable for MySignalSlot'

解決方法

刪除該項目的build目錄,然後重新編譯即可;或者將新增的文件從項目中刪除(文件不刪除),然後再通過IDE“添加現有文件”添加文件,也可以解決。

原因

當通過Qt這個IDE創建新類中添加QObject頭文件和Q_OBJECT後,Qt會生成相應的“moc_XXX.cpp”文件,用於信號槽的通信實現。但是若在創建類時沒有通過Qt添加QObject頭文件和Q_OBJECT,Qt無法生成相應的“moc_XXX.cpp”文件,此時就會報錯:undefined reference to `vtable for XXX',如上面例子。

結尾

只爲記錄,只爲分享! 願所寫能對你有所幫助。不忘記點個贊,謝謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章