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

加盾男爵 2018-06-13 06:51:54
问题的出自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 类名'

今天一整天都没能解决这个问题,求帮助
...全文
2484 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2020-08-27
  • 打赏
  • 举报
回复 1
右键项目
1。 清除
2。 执行qmake
3。 编译运行
weilin_JX 2020-08-03
  • 打赏
  • 举报
回复
我这边是win10 Qt 5.9.8 也是这种问题,然后我重新构建也不行, 就ctrl +s 保存一下 退出软件,重新打开工程,清除一下 在qmake一下, 运行 就可以了
weixin_39686700 2020-04-23
  • 打赏
  • 举报
回复
我也是出现了通用问题,我重新qmake和编译就ok了
  • 打赏
  • 举报
回复
如此诡异的问题?!貌似我有一次moc被杀毒禁用了,就和这个很像。注意看编译过程的输出,有木有红色的。 关闭杀毒,试试看。
  • 打赏
  • 举报
回复
执行qmake吧。
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复
引用 18 楼 pplxlee 的回复:
那你这能解决吗哥们
https://forum.qt.io/topic/91629/sos-undefined-reference-to-vtable-for-class-name/16 qt官方论坛上也搞不定。。。。难道是我电脑本身的问题?但又不知道问题出在哪里?公司电脑有不能随便重装系统。。。。
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复
引用 18 楼 pplxlee 的回复:
[quote=引用 17 楼 qazaq408 的回复:] 我想我找到问题原因了。。。moc工具始终无法生成moc文件,这里我把.h文件使用moc工具单独生成moc文件,单系统无法读取文件,始终提示 F:\doc\Doc\Doc.h:1: Note: No relevant classes found. No output generated. 这里.h文件我使用notpad++更改编码,无论utf-8还是ansi编码都没法生成
那你这能解决吗哥们[/quote] 解决不了啊。。。。。网上这个错误的产生原因是因为编码的问题,Qt使用的是utf-8编码,使用其他编码会导致moc工具读取文件出错,但我用vs2015和notpad++把文件编码改成utf-8的还是这个问题 实际上我试了所有常用的编码,始终是这个问题
Li Xiaolin 2018-06-15
  • 打赏
  • 举报
回复
引用 17 楼 qazaq408 的回复:
我想我找到问题原因了。。。moc工具始终无法生成moc文件,这里我把.h文件使用moc工具单独生成moc文件,单系统无法读取文件,始终提示 F:\doc\Doc\Doc.h:1: Note: No relevant classes found. No output generated. 这里.h文件我使用notpad++更改编码,无论utf-8还是ansi编码都没法生成
那你这能解决吗哥们
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复
我想我找到问题原因了。。。moc工具始终无法生成moc文件,这里我把.h文件使用moc工具单独生成moc文件,单系统无法读取文件,始终提示
F:\doc\Doc\Doc.h:1: Note: No relevant classes found. No output generated.

这里.h文件我使用notpad++更改编码,无论utf-8还是ansi编码都没法生成
Li Xiaolin 2018-06-15
  • 打赏
  • 举报
回复
引用 25 楼 qazaq408 的回复:
[quote=引用 23 楼 pplxlee 的回复:] 关掉360试试呢
在win7系统上装了个win7虚拟机搞定了。。。。原因不清楚,先暂时在虚拟机里搞了。。[/quote] 哈哈,心疼
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复
引用 23 楼 pplxlee 的回复:
关掉360试试呢
在win7系统上装了个win7虚拟机搞定了。。。。原因不清楚,先暂时在虚拟机里搞了。。
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复
引用 23 楼 pplxlee 的回复:
关掉360试试呢
啥都关过了。。。就是不行。。。。在准备虚拟机,用虚拟机在炮哥win7,看看到底是不是电脑的问题...
Li Xiaolin 2018-06-15
  • 打赏
  • 举报
回复
关掉360试试呢
Li Xiaolin 2018-06-15
  • 打赏
  • 举报
回复
尴尬咯,去证明电脑有毛病给老板看看吧
加盾男爵 2018-06-15
  • 打赏
  • 举报
回复

加盾男爵 2018-06-14
  • 打赏
  • 举报
回复
引用 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 这个是下载地址。。。
Li Xiaolin 2018-06-14
  • 打赏
  • 举报
回复
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。
加盾男爵 2018-06-14
  • 打赏
  • 举报
回复
引用 3 楼 pplxlee 的回复:
[quote=引用 2 楼 pplxlee 的回复:] 不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。 不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
再编译一次源码 笔误[/quote] .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 类名'
加盾男爵 2018-06-14
  • 打赏
  • 举报
回复
引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。 不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
注释掉就可以运行,不注释掉编译出错,提示error: undefined reference to `vtable for 类名' 我试过删掉除了代码文件以外的所有文件及目录,包括debug和release目录,只要类李有Q_OBJECT宏就会提示error: undefined reference to `vtable for 类名' 这个错误 如果不添加Q_OBJECT宏,则可以编译运行
Li Xiaolin 2018-06-14
  • 打赏
  • 举报
回复
引用 2 楼 pplxlee 的回复:
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。 不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
再编译一次源码 笔误
加载更多回复(11)

16,813

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧