Qt undefined reference to `vtable for * * * '

【Qt】error: undefined reference to `vtable for MainWindow‘ 1、问题描述 在写一个demo时,想尽量简单,就把MainWindow类的定义和实现都写在main.cpp中,结果编译时报错: main.cpp:-1: error: undefined reference to `vtable for MainWindow' :-1: error: collect2.exe: error: ld returned 1 exit status 2、原因分析 错误信息vtable 表示子类没有把父类的纯虚函数全部重新实现。 一般我们会把MainWindow的定义和实现分别写 阅读详情

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~

缘起:

最近想写个demo验证Qt  connect在第五个参数不同的情况下,各自槽函数运行在哪个线程中。为了简便,就没有创建.h和.cpp文件,直接在main函数中写的,结果在运行时就出现了 undefined reference to `vtable for  * * * '这种错误。

代码如下:

class SendMsg : public QObject
{
    Q_OBJECT
};


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


SendMsg sendMsg;


    return a.exec();
}

经过谷歌,再结合自己的验证,做个总结。

 

1. GCC 常见问题之一

When building C++, the linker says my constructors, destructors or virtual tables are undefined, but I defined them

The ISO C++ Standard specifies that all virtual methods of a class that are not pure-virtual must be defined, but does not require any diagnostic for violations of this rule [class.virtual]/8. Based on this assumption, GCC will only emit the implicitly defined constructors, the assignment operator, the destructor and the virtual table of a class in the translation unit that defines its first such non-inline method.

Therefore, if you fail to define this particular method, the linker may complain about the lack of definitions for apparently unrelated symbols. Unfortunately, in order to improve this error message, it might be necessary to change the linker, and this can't always be done.

The solution is to ensure that all virtual methods that are not pure are defined. Note that a destructor must be defined even if it is declared pure-virtual [class.dtor]

简单来说,C++标准规定:对于类内所有非纯虚函数的虚方法必须被定义,而且对于未遵循该规定的代码不做提示。所以我的程序直接在链接时提示上述错误。

2. Qt 中是怎样出现该问题的

①当把类SendMsg的声明放在单独的.h文件中,无上述错误

当时测试时,为了简便,我直接放在了main.cpp中,所以出现了上述错误。如果将类SendMsg的声明单独放在.h中,则没有上述错误。在Qt中说明如下(Using the Meta-Object Compiler (moc)):

元对象编译器moc是处理Qt的C ++扩展的程序。

moc工具读取C ++头文件。 如果找到一个或多个包含Q_OBJECT宏的类声明,它将生成一个C ++源文件,其中包含这些类的元对象代码。 除此之外,信号和槽机制,运行时类型信息和动态属性系统也需要元对象代码。

必须编译由moc生成的C ++源文件,并与该类的实现链接。

②结论

由以上可知,moc是从头文件中读取程序的,所以放在main.cpp的程序无法生成新的c++文件。

3. 解决方法

①将类SendMsg的声明放在单独的.h文件中,可自动生成moc文件

 

②手动生成.moc文件

在Qt安装目录下,找到moc.exe工具,手动生成.moc文件

 

手动生成.moc文件方法

生成.moc文件效果

现在程序变成这样:

class SendMsg : public QObject
{
    Q_OBJECT
};


#include "main.moc"




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


    SendMsg m_sendMsg;


    return a.exec();
}

Moc文件部分函数:

QObject 宏中声明的未实现的虚方法:

看到这里,你也就知道了由于上面三个虚函数没有被实现,所以会有undefined reference to `vtable for  * * * '这种错误。

4. 小结

认真生活, 努力感悟!

欢迎关注公众号: 

Qt5 undefined reference to `vtable for View‘解决办法:moc文件包含 有时候,我们图省事,就在main.cpp中直接放上一个类的定义,然后再main函数中直接调用,最后就会出现这样的错误: main.cpp???? error: undefined reference to `vtable for xxx类名’ 这个错误的意思就是未定义的某个类的虚表,什么是虚表,我就不详细说了,简单的说就是Qt会将头文件和cpp文件中出现的类记录在一个list表中,这个表是个结构体表,大家可以自己去看看你们的那些个build过程中的moc文件,你在cpp文件中对类的定义,调用都会记录到这个表 阅读详情

相关推荐

Qt程序开发中,有时会遇到“undefined reference to `vtable for‘“的错误提示

总结来说,当Qt程序中出现"undefined reference to `vtable for’"错误时,我们需要检查是否正确使用了虚函数,包括使用关键字virtual、实现对应的虚函数等。在C++中,如果一个类中声明了虚函数,编译器会为该类生成一个虚函数表(vtable),其中存储了虚函数的地址。然而,在Qt程序中,我们有时会遇到"undefined reference to `vtable for’"的错误提示,这是因为缺少了虚函数表的定义。,并在子类中覆盖了基类中的虚函数。

CodeWhizZ的博客 1773

【Qt】报错error: undefined reference to `vtable for的解决方法

1、问题描述 编译Qt程序时,在某个类构造函数定义处报错: error: undefined reference to `vtable for 2、原因分析 导致错误信息的原因是:子类没有实现父类的纯虚函数; 在Qt中,首先要想到的是在一个类中添加了新的继承QObject,并添加了 Q_OBJECT 宏,然后执行构造或重新构造,都会造成这个错误。 根本原因是,只执行构造或重新构造,都不会编译新添加的宏Q_OBJECT。因此在这之前要执行qmake,让moc编译器去预编译Q_OBJECT,然后再执行构造

Turn X7 7053

NDVI空间分布变化Slope趋势分析与F检验(自用)

1.NDVI数据预处理2.一元线性回归分析3.Slope趋势分析与F检验

什么都学亿点点的博客 9017

Qt5 undefined reference to vtable

学习Qt5,自己写个头文件reader.h定义一个类,结果总是报undefined reference to vtable 方法:移除文件,重新添加 就完美解决了

salmonwilliam的博客 592

实现 PDF 添加水印的五种方式

PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。

逸轩 6473

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

QT出现“undefined reference to `vtable for’”问题的原因及解决方法

QT通过信号与槽机制来实现通信的功能。当该类派生自QObject并且在头文件中添加Q_OBJECT宏以后,就可以使用信号与槽。 信号与槽之间可以进行通信的根本原因是:当在类的头文件中添加Q_OBJECT以后QtCreator会自动的创建一个moc_***.cpp文件,用于实现信号与槽通信的代码。但是,有时当我们通过QtCreator创建类的时候,没有通过IDE选项选择其派生自

墙角里的光线 1万+

01-SA8155 QNX 虚拟机Hypervisor

Hypervisor运行在Host OS操作系统上,其他操作系统均在Hypervisor上运行。:Hypervisor直接运行在硬件上,操作系统在Hypervisor之上运行。终止(关闭):echo control 0 dev/vmm。路径:qnx_ap/AMSS/platform/vm/resources/关闭/终止 qvm(GVM):slay -s SIGQUIT qvm。", //host PVM --- 主机。不直接操作/dev/vmm 实现关闭,启动vm。

静虚待令,有物混成 1万+

Qt 出现“undefined reference to `vtable for”原因总结

       由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道。       &nbsp...

huangyibo007的专栏 3977

Vmware虚拟机一打开就蓝屏解决方法

Vmware虚拟机一打开就蓝屏解决方法 问题: 一打开Vmware虚拟机就蓝屏,如下图所示: 解决方法1: 启用和关闭windows功能(对话框)——>虚拟机平台(选项打对勾,默认没勾选)——>确定后重启——>再进应该就好了。 解决方法2: ①.查看电脑中的Hyper-V服务是否关闭 1.打开控制面板-程序-程序和功能 2.双击启用或关闭Windows功能 3.把Hyper-V前面的勾去掉 如果后期发下没有反应,或者电脑本身Hyper-V的服务没有打开,可以先打开在关闭,试

m0_55901666的博客 26万+

多模态特征融合方法总结

由于本人的研究是文本、语音和图像三者模态数据的融合,所以针对的是这三种模态的特征融合方法进行总结。 首先,多模态特征融合的方法大体分为三种

华辰烟雨的博客 9万+

undefined reference to `vtable for’”问题的原因及解决方法

如果使用QtCreator创建类时,没有选择继承自QObject类或其子类,而在创建后手工修改继承自QObject并手工添加Q_OBJECT宏,则在编译时有可能会出现"undefined reference to `vtable for’…有时候,手快(尤其程序员非常迷恋快捷键【doge】),会不小心跳过一些关键步骤,导致出现一些问题。如果添加后,没有马上编译,而是编写了很多业务代码后编译,才发现qt给你报了大量错误。经过自己摸索,还有网友的提示,总结了一些方法供大家参考。

工作学习记录 8万+

Python爬虫实战:使用最新技术爬取新华网新闻数据

在当今信息爆炸的时代,网络爬虫技术已经成为获取互联网数据的重要手段。作为国内权威新闻媒体,新华网每天发布大量高质量的新闻内容,这些数据对于舆情分析、市场研究、自然语言处理等领域具有重要价值。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的新华网新闻爬虫系统。本文详细介绍了如何使用Python最新技术栈构建一个高效、稳定的新华网新闻爬虫系统。我们从基础爬虫开始,逐步添加了代理支持、用户代理轮换、请求延迟、重试机制、动态页面渲染、数据存储等高级功能,最终实现了一个生产可用的分布式爬虫系统。

2201_76125261的博客 1771

Linux+CLion+树莓派远程编译时,Cmake编译出现undefined reference to `vtable for MainWindow'的解决办法...

在win+CLion上进行远程qt开发时碰到以下错误: 错误提示: undefined reference to `vtable for MainWindow' 原因:源文件的目录结构有问题?? 解决方法: 将目录结构不分为include、lib等。直接放在一个文件下,不论是*.ui、*.cpp、*.h等。 参考:https://stackoverflow.com/questions/1...

dingtu6125的博客 532

标题:Stata17安装后遇到Java安装问题解决方法

设置JAVA_HOME环境变量:在Windows上,您需要设置JAVA_HOME环境变量以告诉Stata Java的安装路径。d. 输入变量名为JAVA_HOME,变量值为Java安装路径。注意:请确保您的Java版本与Stata兼容,并使用正确的Java安装路径。设置Stata的Java安装路径:现在,您需要告诉Stata Java的安装路径。如果您看到Java版本信息,则表示Java已成功安装。如果没有安装,请先下载并安装Java。确认Java已安装:首先,请确保您的计算机上已经正确安装了Java。

CyberSparkZ的博客 2867

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Qt经典出错信息之undefined reference to `vtable for classname

原文链接:Qt经典出错信息之undefined reference to `vtable for classname 这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。 出错信息一般类似:undefined reference to vtable for classname MyWidget 在执行make命令后出现。 出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。 因为Q_OBJECT是一个宏,在不同的类

发呆的程序猿 992

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Qt经典出错信息之undefined reference to `vtable for classname

这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。 出错信息一般类似:undefined reference to `vtable for classname MyWidget` 在执行make命令后出现。 出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。 因为Q_OBJECT是一个宏

春风得意,马蹄仍急;少年豪情,一笑难回。 1487

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Qt编译错误 error: undefined reference to `vtable for

qt中会不小心遇到error: undefined reference to `vtable for ....'原来是是子类的一个虚函数声明了,但是,在.cpp中没有定义 实现代码。 比如在.h中把~hellodialog()屏蔽掉后; : 1 class hellodialog : public QDialog 2 { 3 Q_OBJECT 4 publ...

dijianfei2190的博客 674

qt cmake undefined reference to `vtable for MainWindow‘

在Ubuntu+catkin_make上qt开发时碰到以下错误: 错误提示: undefined reference to `vtable for MainWindow' 可能原因: (1)源文件的目录结构有问题,查看CmakeLists看看目录结构是不是对的!!! 看其他博客说目录有问题,但我一直感觉自己的目录应该没有问题,还是太相信自己了。 (2)当然了还有一种可能就是未添加Q_OBJECT 参考自: Linux+CLion+树莓派远程编译时,Cmake编译出现undefin...

lxj362343的博客 1547

【转】Qt经典出错信息之undefined reference to `vtable for classname'

这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。 出错信息一般类似:undefined reference to `vtable for classname MyWidget` 在执行make命令后出现。 出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。 因为Q_OBJECT是一个宏

cly116的博客 1284

error: undefined reference to ‘vtable for …’

这个报警就是子类没有实现父类的纯虚函数,奇怪的是自定义的虚函数都已经进行了定义,这个时候需要留意还有一种情况就是Qt中一个类继承了QObject,而且添加了Q_OBJECT宏,此时就可能出现上面的异常。

lswdcyy的博客 3755

qt undefined reference to `vtable for subClass'

1. 建立一个console工程 QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked dep...

weixin_30270889的博客 197

Qt经典出错信息之undefined reference to `vtable for classn

这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。出错信息一般类似:undefined reference to `vtable for classname MyWidget`,在执行make命令后出现。 出错原因

弹-room 799
上一篇: 杂谈
下一篇: C/C++内存模型
Pou光明
博客等级 码龄12年 3701粉丝 398原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值