Qt工作筆記-undefined reference to `vtable for MyObject'及對moc檔案的進一步理解
阿新 • • 發佈:2018-12-10
原始碼如下:
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檔案