首页 文章

Q_OBJECT链接器错误!

提问于
浏览
12

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

HIMyClass.obj :: error:未解析的外部符号“public:virtual struct QMetaObject const * __thiscall CHIMyClass :: metaObject(void)const”(?metaObject @ CHIMyClass @@ UBEPBUQMetaObject @@ XZ)找不到文件:HIMyClass.obj HIMyClass . obj :: error:未解析的外部符号“public:virtual void * __thiscall CHIMyClass :: qt_metacast(char const *)”(?qt_metacast @ CHIMyClass @@ UAEPAXPBD @ Z)找不到文件:HIMyClass.obj HIMyClass.obj :: error:未解析的外部符号“public:virtual int __thiscall CHIMyClass :: qt_metacall(enum QMetaObject :: Call,int,void * *)”(?qt_metacall @ CHIMyClass @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z)找不到文件:HIMyClass.obj

我的 class 声明就像

class CHIMyClass:public QDialog
{
   Q_OBJECT

   ....

};

当我评论Q_OBJECT时,链接器错误消失(显然我无法使用信号和插槽) . 我使用Qt Creator作为IDE和Qt 4.5.3 . 当我给 Rebuild All 时,肯定会调用 QMake . 我想,它产生的moc_ *文件就是问题所在 . 我使用Windows XP和cl作为编译器 .

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

11 回答

  • 0

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

  • 0

    我有一个类似的问题,它是使用andref的反馈解决的 . 在QT Creator中我简单地说:

    • Build /清理所有

    • 构建/运行qmake

    • 构建/运行

  • 27

    自写这篇文章以来,我已经修改过了

    我发现在重建之前我需要触摸 .pro 文件,即

    • 添加随机字符

    • 保存

    • 删除随机字符

    • 保存

    • 建设项目

    步骤1 - 4似乎使任何旧的moc *文件无效,迫使 qmake 重建它们 . 否则,Rebuild Project似乎使用过时的moc *文件 .

    [编辑]更新的答案 .

    自写这篇文章以来,我几乎已经 cleanqmake 然后 build . qmake 很重要,因为它会重现您需要的moc *文件,如果您要更改.h文件并更改 Q_OBJECT 的继承 . 实际上,在某些情况下,您甚至可以简单地执行 qmake 然后 build 进行增量构建 .

  • 0

    检入文件 MakeFile.debug ,可能 HIMyClass 不存在 .

    我只是重命名 MakeFile.debug ,清理项目并重建所有并编译 .

  • 0

    我有同样的问题,但在我的情况下,它不足以清理 - >构建 . 所以我不得不手动删除在构建过程中创建的所有文件(Mekefiles,在cpp中的ui描述,以及通常由构建过程创建的整个目录),然后才构建成功 .

  • 0

    检查专业文件中是否存在必要的Qt配置选项(至少 QT += core gui . 同时尝试手动删除构建目录中构建/创建的所有内容 . 有时会发生 moc 由于某种原因无法运行 .

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

    更新:this相关问题似乎建议您在编译时不要定义QT_DLL . 你可以尝试一个全新的简单的QtCreator项目(例如,使用一个以mainwindow为子类的小部件)并试试 . 它应该自动包含一个Q_OBJECT头,并尝试比较.pro文件和编译器输出 .

  • 12

    在我的osx盒子上,这是由于缺少moc *文件 . 我通过从我的utf-8编码的.pro文件中删除bom来解决这个问题 . 我将用qt提交一个bug .

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

    “vtable for MainWindow”,引自:mainWindow :: MainWindow(QWidget *)在mainwindow.o中

  • 0

    我找到了另一个可能的原因并解决了这个错误

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

  • 1

    我有这个问题 . 验证.cpp文件中是否有插槽实现的描述 .

  • 1

    我已经从我的主文件中删除了 #include "main.moc" ,忘了重新添加它...这是一个有趣的时间浪费!

  • 1

    来自@chalup和@ierax的答案帮助了我 . 我必须关闭Qt创建者并再次打开它,但qmake才能生效 . 我跟着这些步骤:1 . 将类定义移动到头文件 . 2.将头文件添加到项目中,并确保它针对.pro文件中的HEADERS = \ list列出 . 3.全部清除4.关闭QtCreator(在Windows 10上)5 . 从项目目录中删除Makefile 6.打开QtCreator并打开项目 . 7. Qmake确保生成makefile . 8.重建全部

    这些步骤帮助我解决了这个问题 - 我挣扎了一个多小时,其他各种答案和方法都没有用 . 在运行qmake之前,请确保删除makefile并关闭QtCreator(适用于Windows 10上的至少) .

相关问题