[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工程中即可编译通过。
报错如下
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工程中即可编译通过。
相关文章推荐
- QT中添加Q_OBJECT时编译提示obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const错误解决方法
- 【qt错误】unresolved external symbol "public: virtual struct QMetaObject
- QT遇到unresolved external symbol "public: virtual struct QMetaObject解决方案
- error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const
- Qt编程之信号与槽-------unresolved external symbol "public: virtual struct QMetaObject const * __thiscall XX::metaObject(void)const
- error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const (转)
- error LNK2001: unresolved external symbol "public: virtual struct QMetaObject
- error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const
- QT + VS2005 编译出现 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject 错误
- error LNK2001: unresolved external symbol "public: static struct QMetaObject const QwtPlot::staticMe
- error LNK2001: unresolved external symbol "public: static struct QMetaObject const QwtPlot::staticMe
- Qt 编译时出现“-1: error: LNK2019: unresolved external symbol "public: void __thiscall M”错误
- 错误提示:error LNK2001: unresolved external symbol "public: static int person::weight" (?weight@person@@
- VS2015 + QT 编译出现public: virtual struct QMetaObject const * __thiscall 错误
- vs2010+qt4编译出现error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject等错误
- error LNK2001: unresolved external symbol "protected: virtual struct AFX_EVENTSINKMAP …改正方法。
- 【C++ static】关于 error LNK2001: unresolved external symbol "public: static class CString 错误处理
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl MainWindow::metaObject(
- Qt中编译出现mainwindow.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall MyWidget::M
- 关于 error LNK2001: unresolved external symbol "public: static class CString 错误处理