我在构建应用程序时收到以下链接器错误 .
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 回答
此类错误通常意味着您没有将类的 Headers 添加到pro文件中的“HEADERS”变量(元对象编译器仅为此变量中列出的 Headers 生成moc_文件) . 记得在更改.pro文件后运行qmake!
我有一个类似的问题,它是使用andref的反馈解决的 . 在QT Creator中我简单地说:
Build /清理所有
构建/运行qmake
构建/运行
自写这篇文章以来,我已经修改过了
我发现在重建之前我需要触摸
.pro
文件,即添加随机字符
保存
删除随机字符
保存
建设项目
步骤1 - 4似乎使任何旧的moc *文件无效,迫使
qmake
重建它们 . 否则,Rebuild Project似乎使用过时的moc *文件 .[编辑]更新的答案 .
自写这篇文章以来,我几乎已经
clean
,qmake
然后build
.qmake
很重要,因为它会重现您需要的moc *文件,如果您要更改.h文件并更改Q_OBJECT
的继承 . 实际上,在某些情况下,您甚至可以简单地执行qmake
然后build
进行增量构建 .检入文件
MakeFile.debug
,可能HIMyClass
不存在 .我只是重命名
MakeFile.debug
,清理项目并重建所有并编译 .我有同样的问题,但在我的情况下,它不足以清理 - >构建 . 所以我不得不手动删除在构建过程中创建的所有文件(Mekefiles,在cpp中的ui描述,以及通常由构建过程创建的整个目录),然后才构建成功 .
检查专业文件中是否存在必要的Qt配置选项(至少
QT += core gui
. 同时尝试手动删除构建目录中构建/创建的所有内容 . 有时会发生moc
由于某种原因无法运行 .您也可以尝试自己运行moc命令,并查看它输出的内容(您可以在QtCreator的“编译输出”选项卡中找到命令行 .
更新:this相关问题似乎建议您在编译时不要定义QT_DLL . 你可以尝试一个全新的简单的QtCreator项目(例如,使用一个以mainwindow为子类的小部件)并试试 . 它应该自动包含一个Q_OBJECT头,并尝试比较.pro文件和编译器输出 .
在我的osx盒子上,这是由于缺少moc *文件 . 我通过从我的utf-8编码的.pro文件中删除bom来解决这个问题 . 我将用qt提交一个bug .
goggle搜索的错误...注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义 .
我找到了另一个可能的原因并解决了这个错误
如果已在.h文件中声明了插槽但未在实现中定义其主体,则也会发生此错误
我有这个问题 . 验证.cpp文件中是否有插槽实现的描述 .
我已经从我的主文件中删除了
#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上的至少) .