您的位置:首页 > 移动开发 > Objective-C

[Qt4]VS2010编译提示error LNK2001: unresolved external symbol "public: virtual struct QMetaObject等错误解决方案

2017-08-22 15:50 656 查看
刚学习Qt4编程,在编译一个小程序的时候出现了链接错误。

报错如下

1>—— 已启动全部重新生成: 项目: Test, 配置: Debug x64 ——

1> FindDialog.cpp

1> main.cpp

1> Generating Code…

1>FindDialog.obj : error LNK2001: unresolved external symbol “public: virtual struct QMetaObject const * __cdecl FindDialog::metaObject(void)const ” (?metaObject@FindDialog@@UEBAPEBUQMetaObject@@XZ)

1>FindDialog.obj : error LNK2001: unresolved external symbol “public: virtual void * __cdecl FindDialog::qt_metacast(char const *)” (?qt_metacast@FindDialog@@UEAAPEAXPEBD@Z)

1>FindDialog.obj : error LNK2001: unresolved external symbol “public: virtual int __cdecl FindDialog::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@FindDialog@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)

1>FindDialog.obj : error LNK2001: unresolved external symbol “public: static struct QMetaObject const FindDialog::staticMetaObject” (?staticMetaObject@FindDialog@@2UQMetaObject@@B)

1>FindDialog.obj : error LNK2019: unresolved external symbol “protected: void __cdecl FindDialog::findNext(class QString const &,enum Qt::CaseSensitivity)” (?findNext@FindDialog@@IEAAXAEBVQString@@W4CaseSensitivity@Qt@@@Z) referenced in function “private: void __cdecl FindDialog::findClicked(void)” (?findClicked@FindDialog@@AEAAXXZ)

1>FindDialog.obj : error LNK2019: unresolved external symbol “protected: void __cdecl FindDialog::findPrevious(class QString const &,enum Qt::CaseSensitivity)” (?findPrevious@FindDialog@@IEAAXAEBVQString@@W4CaseSensitivity@Qt@@@Z) referenced in function “private: void __cdecl FindDialog::findClicked(void)” (?findClicked@FindDialog@@AEAAXXZ)

1>C:\Users\Grey\Desktop\Test\x64\Debug\Test.exe : fatal error LNK1120: 6 unresolved externals

========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

原因

  对于所有定义了信号和槽的类,在类定义的开始处的Q_OBJECT宏都是必需的。由于FindDialog类的定义包含Q_OBJECT宏,因而由qmkae生成的makefile将会自动包含一些运行moc的规则,moc(meta-object compiler)是Qt的元对象编译器。

                     Qt的元对象系统

 Qt的主要成就之一就是使用了一种机制对C++进行了扩展,并且使用这种机制创建了独立的软件组件。这些组件可以绑定在一起,但任何一个组件对于它所要连接的组件的情况事先都一无所知。

 这种机制称为元对象系统(meta-object system),它提供了关键的两项技术:信号-槽以及内省(introspection)。内省功能对于实现信号和槽是必需的,并且允许应用程序的开发人员在运行时获得有关QObject子类的“元信息”(meta-infomation),包括一个含有对象的类名以及它所支持的信号和槽的列表。这一机制也支持属性(广泛用于Qt设计师中)和文本翻译(用于国际化),并且它也为QtScript模块奠定了基础。从Qt4.2开始,可以动态添加属性。

 标准C++没有对Qt的元对象系统所需要的动态元信息提供支持。Qt通过提供一个独立的moc工具解决了这个问题,moc解析Q_OBJECT类的定义并且通过C++函数来提供可供使用的信息。由于moc使用纯C++来实现它的所有功能,所以Qt的元对象系统可以在任意C++编译器上工作。

 由于程序中使用了Q_OBJECT宏来定义类,所以必须运行moc来生成用于由Q_OBJECT声明的所有函数和所有信号的实现。

解决方案

将cmd目录跳到工程文件目录下,然后执行cmd命令(moc.exe是Qt下的工具,执行命令前保证Qt的bin目录已经添加到系统环境变量PATH中):

moc FindDialog.h –o moc_FindDialog.cpp

同目录下会生成一个moc_FindDialog.cpp文件,将该文件添加到VS工程中即可编译通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐