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

来源:互联网 发布:java代理模式 编辑:程序博客网 时间:2024/06/05 11:51

刚学习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工程中即可编译通过。

阅读全文
0 0
原创粉丝点击