Q_OBJECT 链接器错误!

问题描述 投票:0回答:12

构建应用程序时,我收到以下链接器错误。

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 作为编译器。

此链接器错误背后的原因可能是什么?

c++ qt qt4 linker-errors qobject
12个回答
31
投票

此类错误通常意味着您尚未将类的标头添加到 pro 文件中的“HEADERS”变量中(元对象编译器仅针对此变量中列出的标头生成 moc_ 文件)。记得在更改 .pro 文件后运行 qmake!


13
投票

我有一个类似的问题,并使用安德烈的反馈解决了。在 QT Creator 中我只是:

  1. 构建/清理全部
  2. 构建/运行 qmake
  3. 构建/运行

2
投票

每当您更改 QObject 继承时,请务必执行

clean
qmake
,然后
build
qmake
非常重要,因为它会针对 .h 文件中的任何新 Qt 更改更新 moc* 文件,包括 QObject 继承,即
Q_OBJECT
。事实上,在某些情况下,您甚至可以简单地执行
qmake
然后
build
来进行增量构建。


1
投票

签入文件

MakeFile.debug
,也许
HIMyClass
不存在。

我只是重命名

MakeFile.debug
,清理项目并重建全部,然后就可以编译了。


1
投票

我遇到了同样的问题,但就我而言,清理 - >构建还不够。因此,我必须手动删除构建过程中创建的所有文件(Mekefiles、cpp 中的 ui descriptionns,以及通常由构建过程创建的整个目录),然后构建才会成功。


0
投票

检查 pro 文件中是否存在必要的 Qt 配置选项(至少

QT += core gui
。还可以尝试手动删除构建目录中构建/创建的所有内容。有时会发生
moc
由于某种原因无法运行。

您也可以尝试自己运行 moc 命令,看看它输出什么(您可以在 QtCreator 的“编译输出”选项卡中找到命令行。

更新:this相关问题似乎表明您在编译时没有定义QT_DLL。您可以尝试一个全新的简单 QtCreator 项目(例如,带有一个子类化 mainwindow 的小部件)并尝试一下。它应该自动包含 Q_OBJECT 标头并尝试比较 .pro 文件和编译器输出。


0
投票

在我的 osx 机器上,这是由于缺少 moc* 文件造成的。 我通过从 utf-8 编码的 .pro 文件中删除 bom 来修复此问题。 我将使用 qt 提交错误。

护目镜搜索错误... 注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义。

“MainWindow 的 vtable”,引用自:

 MainWindow::MainWindow(QWidget*)in mainwindow.o

0
投票

我找到了该错误的另一个可能原因和解决方案

如果在 .h 文件中声明了槽,但在实现中没有定义其主体,也会发生此错误


0
投票

我遇到了这个问题。 验证.cpp文件中是否有slot实现的描述。


0
投票

我已从主文件中删除了

#include "main.moc"
,但忘记重新添加它...这真是浪费时间!


0
投票

@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)。


0
投票

在 Windows 和 Visual Studio 上工作时,始终将包含

Q_OBJECT
宏的类定义放入头文件中,而不是放入源文件中。因为这会扰乱 Qt 和 Visual Studio 的构建过程。刚刚在 Visual Studio 2022 和 Qt 6.8 上看到

© www.soinside.com 2019 - 2024. All rights reserved.