Qt工作笔记-undefined reference to `vtable for MyObject'及对moc文件的进一步理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/82780858

源码如下:

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文件

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/82780858