使用 Q_OBJECT 时发生链接错误(无法解析的外部符号)
问题
如果在使用 Q_OBJECT 关键宏时,发生以下错误
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl Widget::metaObject(void)const " (?metaObject@Widget@@UEBAPEBUQMetaObject@@XZ)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __cdecl Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UEAAPEAXPEBD@Z)
1>main.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __cdecl Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
1>D:\userCodes\visualStudio\qtDemo\QtWidgetsApplication1\x64\Debug\QtWidgetsApplication1.exe : fatal error LNK1120: 3 个无法解析的外部命令
种情况所以“类型识别”错误导致 。
解决步骤:

如文件为: Widget.h
那么请打开文件属性:

打开文件属性页,设置为 :Qt Meta-Object Compiler (moc)

重新编译
重新生成开始于 19:56...
1>------ 已启动全部重新生成: 项目: QtWidgetsApplication1, 配置: Debug x64 ------
1>moc Widget.h
1>main.cpp
1>Widget.cpp
1>moc_Widget.cpp
1>QtWidgetsApplication1.vcxproj -> D:\userCodes\visualStudio\qtDemo\QtWidgetsApplication1\x64\Debug\QtWidgetsApplication1.exe
========== “全部重新生成”: 1 成功,0 失败,0已跳过 ==========
========== 重新生成 于 19:57 完成,耗时 04.388 秒 ==========

结论:
编译工具无法及时对新文件进行一个配置解析,仅仅是当做一般的编译文件(头文件),未经过moc(qt工具)处理导致的错误。只需要手动配置即可(或者使用文件生成工具实现自动化操作。)
更多推荐



所有评论(0)