构建应用程序时,我收到以下链接器错误。
HIMyClass.obj ::错误: 未解决的外部符号“public: 虚拟结构QMetaObject const * __thiscall CHIMyClass :: metaObject(void)const “ (?元对象@ CHIMyClass @@ UBEPBUQMetaObject @@ XZ) 找不到档案:HIMyClass.obj
HIMyClass.obj ::错误: 未解决的外部符号“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(枚举 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。当我提供重建全部时,肯定会调用 QMake 。我想,它产生的moc_ *文件就是问题所在。我使用Windows XP和cl作为编译器。
这个链接器错误背后的原因可能是什么?
答案 0 :(得分:28)
此类错误通常意味着您尚未将类的标题添加到pro文件中的“HEADERS”变量(元对象编译器仅为此变量中列出的标题生成moc_文件)。记得在更改.pro文件后运行qmake!
答案 1 :(得分:12)
我遇到了类似的问题,并且使用了andref的反馈解决了这个问题。在QT Creator中,我只是:
答案 2 :(得分:2)
每当您更改QObject继承时,请务必执行clean
,qmake
然后build
。 qmake
很重要,因为它更新了.h文件中包含QObject继承的任何新Qt更改的moc *文件,即Q_OBJECT
。实际上,在某些情况下,您甚至可以简单地执行qmake
然后build
进行增量构建。
答案 3 :(得分:1)
签入文件MakeFile.debug
,可能HIMyClass
不存在。
我只是重命名MakeFile.debug
,清理项目并重建所有内容并进行编译。
答案 4 :(得分:1)
我有同样的问题,但在我的情况下,它还不够清洁 - >建立。所以我不得不手动删除在构建过程中创建的所有文件(Mekefiles,在cpp中的ui描述,以及通常由构建过程创建的整个目录),然后才构建成功。
答案 5 :(得分:0)
检查专业文件(QT += core gui
)中是否存在必要的Qt配置选项。同时尝试手动删除构建目录中构建/创建的所有内容。有时会发生moc
无法运行出于某种原因。
您也可以尝试自己运行moc命令,看看它输出的内容(您可以在QtCreator的“编译输出”选项卡中找到命令行。
更新:this 相关的问题似乎建议您在编译时不要定义QT_DLL。你可以尝试一个全新的简单的QtCreator项目(例如,使用一个以mainwindow为子窗口的小部件)并试试。它应该自动包含一个Q_OBJECT头,并尝试比较.pro文件和编译器输出。
答案 6 :(得分:0)
这是由于缺少moc *文件。 我通过从我的utf-8编码的.pro文件中删除bom来解决这个问题。 我将用qt。
提交一个错误 护目镜搜索的错误... 注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。
" vtable for MainWindow",引自:
MainWindow::MainWindow(QWidget*)in mainwindow.o
答案 7 :(得分:0)
我发现了另一个可能的原因并解决了这个错误
如果在.h文件中声明了插槽但未在实现中定义其主体,也会发生此错误
答案 8 :(得分:0)
我有这个问题。 验证.cpp文件中是否有插槽实现的描述。
答案 9 :(得分:0)
我已从我的主文件中删除了#include "main.moc"
,忘记重新添加...这是一个有趣的时间浪费!
答案 10 :(得分:0)
来自@chalup和@ierax的答案帮助了我。我必须关闭Qt创建者并再次打开它,但qmake才能生效。我按照以下步骤操作: 1.将类定义移动到头文件。 2.将头文件添加到项目中,并确保它针对.pro文件中的HEADERS + = \ list列出。 干净利落 4.关闭QtCreator(在Windows 10上) 5.从项目目录中删除Makefile 6.打开QtCreator并打开项目。 7. Qmake确保生成makefile。 8.重建所有
这些步骤帮助我解决了这个问题 - 我挣扎了一个多小时,各种其他答案和方法都没有用。在运行qmake之前,请确保删除makefile并关闭QtCreator(适用于Windows 10上的至少)。