搞了一整天,求助:error: undefined reference to `vtable for 类名'

时间:2022-02-10 04:36:50
问题的出自Q_OBJECT
PS:一下情况vs2015/Ming Qt5.10均会出现

第一步,启动QtCreator后,新建->项目(Applicaton)基类选择QDialog,然后对代码不做任何改动,直接编译,提示错误
error: undefined reference to `vtable for 类名'
然后注释掉Q_OBJECT宏,编译通过,运行OK

第二步,在这个自定义的QDialog上添加一个按钮,然后有代码 

connect(cancel_PushButton,SIGNAL(clicked()),this,SOT(close()));

编译通过,运行程序后,点击按钮,程序关闭
这里的问题是该类的Q_OBJECT宏处于被注释掉的状态,但却可以正常使用信号与槽

第三步,在上面的自定义QDialog上再添加一个按钮,同时添加一个一个自定义槽,代码类似

connect(tk_PushButton,SIGNAL(clicked()),this,SLOT(testPro()));

编译时提示“没有槽testPro()”,鼠标点 tk_PushButtn没有反应(testPro()函数里面有qDebug()的输出)
原因是Q_OBJECT宏被注释,但是上面的关闭按钮任然可用。。。。

第四步 取消掉Q_OBJECT的注释,然后编译,失败,提示
error: undefined reference to `vtable for 类名'

然后百度了相关关键字(至某人),解决这类的问题的方法只有一个,删掉MOC文件,重新make,然后编译,但我试了删除所有除了源代码外的文件,重新编译,也尝试过在命令行使用
qmake -project
qmake testPro
mingw32-make
单结果是一样的,都编译失败,提示
error: undefined reference to `vtable for 类名'

今天一整天都没能解决这个问题,求帮助

15 个解决方案

#1


各路大神,你们在哪里。。。公司就我一个会Qt的,现在要用Qt做项目,但这个问题解决不了啊。。。。老板整天盯着我

#2


不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

#3


引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

再编译一次源码 笔误

#4


引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

注释掉就可以运行,不注释掉编译出错,提示error: undefined reference to `vtable for 类名' 
我试过删掉除了代码文件以外的所有文件及目录,包括debug和release目录,只要类李有Q_OBJECT宏就会提示error: undefined reference to `vtable for 类名' 这个错误
如果不添加Q_OBJECT宏,则可以编译运行

#5


引用 3 楼 pplxlee 的回复:
Quote: 引用 2 楼 pplxlee 的回复:

不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

再编译一次源码 笔误

.h文件
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

.cpp文件
#include "Dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
}

Dialog::~Dialog()
{

}

main.cpp文件
#include "Dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

这个是用QtCreator 创建的,我啥都没改,编译通过过,提示error: undefined reference to `vtable for 类名'
如果我把Q_OBJECT宏注释掉,编译通过,可以运行,
我把这三个文件意外的全部文件和目录都删了,编译还是这个样子,我把这三个文件拷贝到别的目录,使用命令行编译
qmake -project
qmake MocTest.pro
mingw32-make
结果还是提示error: undefined reference to `vtable for 类名'

#6


我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。

#7


引用 6 楼 pplxlee 的回复:
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。

我的qt是从qtcn.org上下载下来的。。。。不会是假的吧
http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.9/5.9.5/qt-opensource-windows-x86-5.9.5.exe
这个是下载地址。。。

#8


搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
我是这样的

#9


是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

#10


引用 9 楼 pplxlee 的回复:
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

重装了5.10版和5.7版,这两个版本是从qt官网上下的,测试还是这个问题

#11


看看你的项目构建配置有没有问题

#12


引用 9 楼 pplxlee 的回复:
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

#13


引用 11 楼 pplxlee 的回复:
看看你的项目构建配置有没有问题

构建也没问题,只要不适用Q_BJECT宏程序就能编译运行,唯一可能的问题,是编译时有一个question
E:\MyPro\LoadingDialog\LoadingDialog.h:1: Note: No relevant classes found. No output generated.
搞了一整天,求助:error: undefined reference to `vtable for 类名'

#14


引用 12 楼 qazaq408 的回复:
Quote: 引用 9 楼 pplxlee 的回复:

是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。

#15


引用 14 楼 pplxlee 的回复:
Quote: 引用 12 楼 qazaq408 的回复:

Quote: 引用 9 楼 pplxlee 的回复:

是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。

悲剧啊。。。公司就我一个人用Qt的,都找不到人了问。。。。老板还在后面 催。。 搞了一整天,求助:error: undefined reference to `vtable for 类名'

#1


各路大神,你们在哪里。。。公司就我一个会Qt的,现在要用Qt做项目,但这个问题解决不了啊。。。。老板整天盯着我

#2


不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

#3


引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

再编译一次源码 笔误

#4


引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

注释掉就可以运行,不注释掉编译出错,提示error: undefined reference to `vtable for 类名' 
我试过删掉除了代码文件以外的所有文件及目录,包括debug和release目录,只要类李有Q_OBJECT宏就会提示error: undefined reference to `vtable for 类名' 这个错误
如果不添加Q_OBJECT宏,则可以编译运行

#5


引用 3 楼 pplxlee 的回复:
Quote: 引用 2 楼 pplxlee 的回复:

不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。

再编译一次源码 笔误

.h文件
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

.cpp文件
#include "Dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
}

Dialog::~Dialog()
{

}

main.cpp文件
#include "Dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

这个是用QtCreator 创建的,我啥都没改,编译通过过,提示error: undefined reference to `vtable for 类名'
如果我把Q_OBJECT宏注释掉,编译通过,可以运行,
我把这三个文件意外的全部文件和目录都删了,编译还是这个样子,我把这三个文件拷贝到别的目录,使用命令行编译
qmake -project
qmake MocTest.pro
mingw32-make
结果还是提示error: undefined reference to `vtable for 类名'

#6


我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。

#7


引用 6 楼 pplxlee 的回复:
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。

我的qt是从qtcn.org上下载下来的。。。。不会是假的吧
http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.9/5.9.5/qt-opensource-windows-x86-5.9.5.exe
这个是下载地址。。。

#8


搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
搞了一整天,求助:error: undefined reference to `vtable for 类名'
我是这样的

#9


是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

#10


引用 9 楼 pplxlee 的回复:
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

重装了5.10版和5.7版,这两个版本是从qt官网上下的,测试还是这个问题

#11


看看你的项目构建配置有没有问题

#12


引用 9 楼 pplxlee 的回复:
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

#13


引用 11 楼 pplxlee 的回复:
看看你的项目构建配置有没有问题

构建也没问题,只要不适用Q_BJECT宏程序就能编译运行,唯一可能的问题,是编译时有一个question
E:\MyPro\LoadingDialog\LoadingDialog.h:1: Note: No relevant classes found. No output generated.
搞了一整天,求助:error: undefined reference to `vtable for 类名'

#14


引用 12 楼 qazaq408 的回复:
Quote: 引用 9 楼 pplxlee 的回复:

是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。

#15


引用 14 楼 pplxlee 的回复:
Quote: 引用 12 楼 qazaq408 的回复:

Quote: 引用 9 楼 pplxlee 的回复:

是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。

还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定

产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。

悲剧啊。。。公司就我一个人用Qt的,都找不到人了问。。。。老板还在后面 催。。 搞了一整天,求助:error: undefined reference to `vtable for 类名'