15

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

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const" (?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ) 找不到文件:HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) 找不到文件:HIMyClass.obj

HIMyClass.obj:: 错误:未解析的外部符号“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 作为编译器。

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

4

11 回答 11

30

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

于 2010-07-16T12:31:45.567 回答
13

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

  1. 构建/清理所有
  2. 构建/运行 qmake
  3. 构建/运行
于 2011-02-11T08:51:01.643 回答
2

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

于 2013-07-03T06:20:55.240 回答
1

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

我只是 rename MakeFile.debug, Cl​​ean the Project 并 Rebuild All 并编译。

于 2010-08-18T22:25:44.207 回答
1

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

于 2012-05-23T12:25:59.800 回答
0

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

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

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

于 2010-07-16T11:52:55.300 回答
0

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

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

“vtable for MainWindow”,引用自:

 MainWindow::MainWindow(QWidget*)in mainwindow.o
于 2012-08-26T18:08:07.063 回答
0

我发现了此错误的另一个可能原因和解决方案

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

于 2014-06-05T07:46:08.060 回答
0

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

于 2014-08-04T13:38:04.620 回答
0

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

于 2016-03-11T21:25:30.797 回答
0

@chalup 和 @ierax 的回答帮助了我。我必须关闭 Qt 创建器并再次打开它才能使 qmake 生效。我按照以下步骤操作: 1. 将类定义移至头文件。2. 将头文件添加到项目中,并确保它在 .pro 文件中的 HEADERS += \ 列表中列出。3. Clean-all 4. 关闭 QtCreator(在 Windows 10 上) 5. 从项目目录中删除 Makefiles 6. 打开 QtCreator 并打开项目。7. Qmake 确保生成makefile。8. 全部重建

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

于 2016-06-16T03:28:17.907 回答