如题所述
第1个回答 2024-08-16
缘起:
在验证Qt connect在不同参数情况下,槽函数运行线程时,直接在main函数中编写代码,导致运行出现"undefined reference to 'vtable for * * * '"错误。查阅资料后,对这一问题有了一定了解。
代码示例如下:
此错误由C++标准引起,标准要求所有非纯虚函数必须被定义。GCC链接器在翻译单元中只会隐式定义构造函数、赋值运算符、析构函数和类的虚表。如若未定义这类特定方法,链接器可能会报告与之无关的符号定义缺失。
在Qt环境中,此问题的出现与元对象编译器(moc)有关。moc从头文件中读取程序,若类声明单独位于.h文件中,则可自动生成moc文件,避免上述问题。可通过手动生成.moc文件解决,此过程涉及Qt安装目录下moc.exe工具。
解决步骤如下:
1. 将类声明放在单独的.h文件中,使用moc生成新的C++文件。
2. 手动生成.moc文件,利用Qt安装目录下的moc.exe工具。
最终,通过调整代码结构,确保所有非纯虚函数被定义,问题得以解决。
通过以上总结,我们了解到在使用Qt进行开发时,应遵循C++标准和Qt扩展规则,尤其是类声明与实现的分离,确保所有必要函数被正确定义。这有助于避免链接时的错误,提升代码质量与程序稳定性。
生活认真,感悟深入,欢迎关注:Pou光明
在验证Qt connect在不同参数情况下,槽函数运行线程时,直接在main函数中编写代码,导致运行出现"undefined reference to 'vtable for * * * '"错误。查阅资料后,对这一问题有了一定了解。
代码示例如下:
此错误由C++标准引起,标准要求所有非纯虚函数必须被定义。GCC链接器在翻译单元中只会隐式定义构造函数、赋值运算符、析构函数和类的虚表。如若未定义这类特定方法,链接器可能会报告与之无关的符号定义缺失。
在Qt环境中,此问题的出现与元对象编译器(moc)有关。moc从头文件中读取程序,若类声明单独位于.h文件中,则可自动生成moc文件,避免上述问题。可通过手动生成.moc文件解决,此过程涉及Qt安装目录下moc.exe工具。
解决步骤如下:
1. 将类声明放在单独的.h文件中,使用moc生成新的C++文件。
2. 手动生成.moc文件,利用Qt安装目录下的moc.exe工具。
最终,通过调整代码结构,确保所有非纯虚函数被定义,问题得以解决。
通过以上总结,我们了解到在使用Qt进行开发时,应遵循C++标准和Qt扩展规则,尤其是类声明与实现的分离,确保所有必要函数被正确定义。这有助于避免链接时的错误,提升代码质量与程序稳定性。
生活认真,感悟深入,欢迎关注:Pou光明