繁体   English   中英

Q_OBJECT链接器错误!

[英]Q_OBJECT linker error!

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

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 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!

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

  1. 建立/清洁所有
  2. 构建/运行qmake
  3. 构建/运行

每当你改变QObject继承时,一定要做一个cleanqmake然后build qmake非常重要,因为它更新了.h文件中包含QObject继承(即Q_OBJECT任何新Qt更改的moc *文件。 实际上,在某些情况下,您甚至可以简单地执行qmake然后build增量构建。

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

HIMyClass入文件MakeFile.debug ,也许HIMyClass不存在。

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

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

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

“适用于MainWindow的vtable”,引自:

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

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

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

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

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

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

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

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

来自@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上的至少)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM