构建应用程序时,我收到以下链接器错误。
HIMyClass.obj::错误: 未解析的外部符号“public: 虚拟结构 QMetaObject const * __thiscall CHIMyClass::metaObject(void)const ” (?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ) 找不到文件:HIMyClass.obj
HIMyClass.obj::错误: 未解析的外部符号“public: 虚空 * __thiscall CHIMyClass::qt_metacast(char 常量 *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) 找不到文件:HIMyClass.obj
HIMyClass.obj::错误: 未解析的外部符号“public: 虚拟 int __thiscall CHIMyClass::qt_metacall(枚举 QMetaObject::Call,int,void * *)" (?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 找不到文件:HIMyClass.obj
我的班级声明就像
class CHIMyClass:public QDialog
{
Q_OBJECT
....
};
当我评论 Q_OBJECT 时,链接器错误就会消失(显然我无法使用信号和槽)。我使用 Qt Creator 作为 IDE 和 Qt 4.5.3。当我给出 Rebuild All 时,确定会调用 QMake。我想,问题出在moc_*文件的生成上。我使用 Windows XP 和 cl 作为编译器。
此链接器错误背后的原因可能是什么?
此类错误通常意味着您尚未将类的标头添加到 pro 文件中的“HEADERS”变量中(元对象编译器仅针对此变量中列出的标头生成 moc_ 文件)。记得在更改 .pro 文件后运行 qmake!
我有一个类似的问题,并使用安德烈的反馈解决了。在 QT Creator 中我只是:
每当您更改 QObject 继承时,请务必执行
clean
、qmake
,然后 build
。 qmake
非常重要,因为它会针对 .h 文件中的任何新 Qt 更改更新 moc* 文件,包括 QObject 继承,即 Q_OBJECT
。事实上,在某些情况下,您甚至可以简单地执行 qmake
然后 build
来进行增量构建。
签入文件
MakeFile.debug
,也许HIMyClass
不存在。
我只是重命名
MakeFile.debug
,清理项目并重建全部,然后就可以编译了。
我遇到了同样的问题,但就我而言,清理 - >构建还不够。因此,我必须手动删除构建过程中创建的所有文件(Mekefiles、cpp 中的 ui descriptionns,以及通常由构建过程创建的整个目录),然后构建才会成功。
检查 pro 文件中是否存在必要的 Qt 配置选项(至少
QT += core gui
。还可以尝试手动删除构建目录中构建/创建的所有内容。有时会发生 moc
由于某种原因无法运行。
您也可以尝试自己运行 moc 命令,看看它输出什么(您可以在 QtCreator 的“编译输出”选项卡中找到命令行。
更新:this相关问题似乎表明您在编译时没有定义QT_DLL。您可以尝试一个全新的简单 QtCreator 项目(例如,带有一个子类化 mainwindow 的小部件)并尝试一下。它应该自动包含 Q_OBJECT 标头并尝试比较 .pro 文件和编译器输出。
在我的 osx 机器上,这是由于缺少 moc* 文件造成的。 我通过从 utf-8 编码的 .pro 文件中删除 bom 来修复此问题。 我将使用 qt 提交错误。
护目镜搜索错误... 注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义。
“MainWindow 的 vtable”,引用自:
MainWindow::MainWindow(QWidget*)in mainwindow.o
我找到了该错误的另一个可能原因和解决方案
如果在 .h 文件中声明了槽,但在实现中没有定义其主体,也会发生此错误
我遇到了这个问题。 验证.cpp文件中是否有slot实现的描述。
我已从主文件中删除了
#include "main.moc"
,但忘记重新添加它...这真是浪费时间!
@chalup 和 @ierax 的回答对我有帮助。我必须关闭 Qt 创建器并再次打开它才能使 qmake 生效。我按照以下步骤操作: 1. 将类定义移至头文件中。 2. 将头文件添加到项目中,并确保它在 .pro 文件中的 HEADERS += \ 列表中列出。 3. 全部清理 4.关闭QtCreator(在Windows 10上) 5.删除项目目录下的Makefile 6.打开QtCreator并打开项目。 7. Qmake 确保生成 makefile。 8. 重建全部
这些步骤帮助我解决了这个问题 - 我用各种其他答案和方法挣扎了一个多小时,但没有任何效果。在运行 qmake 之前,请确保删除 makefile 并关闭 QtCreator(至少适用于 Windows 10)。
在 Windows 和 Visual Studio 上工作时,始终将包含
Q_OBJECT
宏的类定义放入头文件中,而不是放入源文件中。因为这会扰乱 Qt 和 Visual Studio 的构建过程。刚刚在 Visual Studio 2022 和 Qt 6.8 上看到