1. 程式人生 > >Qt工作筆記-undefined reference to `vtable for MyObject'及對moc檔案的進一步理解

Qt工作筆記-undefined reference to `vtable for MyObject'及對moc檔案的進一步理解

原始碼如下:

main.cpp

#include <QApplication>
#include <QObject>
#include <QTextCodec>

class MyObject:public QObject{
    Q_OBJECT
public:
    MyObject(QObject *parent=0):QObject(0){}

};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    return a.exec();
}

當原始碼是這樣的時候,程式是可以執行的,但如果例項化下物件,就有問題了!

原始碼如下:

#include <QApplication>
#include <QObject>

class MyObject:public QObject{
    Q_OBJECT
public:
    MyObject(QObject *parent=0):QObject(0){}

};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyObject *myObject=new MyObject;

    return a.exec();
}

報錯如下:

造成這樣的原因是因為使用了Qt的東西(QObject與Q_OBJECT)而沒有翻譯成C++認識的原始碼,也就是moc檔案!一般的解決方案是把類放到單獨的.h檔案,在.cpp檔案裡面包含下。

原因如下:

.h的內容被插入到.c中,作為.c的內容被編譯。.h檔案本身不直接參加編譯。

.h檔案不能單獨進行編譯,它只能包含在.c/.cpp檔案中,或者與其組建一個工程,然後編譯.c/.cpp檔案。用包含的形式編譯的時候,是把.h檔案作為.c/.cpp檔案的一部分來進行編譯。

寫過Makefile的朋友應該會知道!

最後原始碼如下:

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>

class MyObject:public QObject{
    Q_OBJECT
public:
    MyObject(QObject *parent=0):QObject(0){}

};

#endif // MYOBJECT_H

main.cpp

#include <QApplication>
#include "myobject.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyObject *myObject=new MyObject;

    return a.exec();
}

可以正常執行,在Debug檔案裡面可以看到moc檔案