错误场景
在VS2017+Qt5.12.0环境中调用PCL,类PclVisualizer继承自类QMainWindow,在类PclVisualizer中添加了QVTKWidget之后,只要添加Q_OBJECT就会出现编译错误。
错误提示
1.编译过程输出
PclVisualizer.h(0): Note: No relevant classes found. No output generated.
2.编译后报错
1>PclVisualizer.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall PclVisualizer::metaObject(void)const " (?metaObject@PclVisualizer@@UBEPBUQMetaObject@@XZ)
1>PclVisualizer.obj : error LNK2001: 无法解析的外部符号 “public: virtual void * __thiscall PclVisualizer::qt_metacast(char const *)” (?qt_metacast@PclVisualizer@@UAEPAXPBD@Z)
1>PclVisualizer.obj : error LNK2001: 无法解析的外部符号 “public: virtual int __thiscall PclVisualizer::qt_metacall(enum QMetaObject::Call,int,void * *)” (?qt_metacall@PclVisualizer@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>PclVisualizer.obj : error LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const MdiChild::staticMetaObject” (?staticMetaObject@MdiChild@@2UQMetaObject@@B)
错误原因
类PclVisualizer所在的PclVisualizer.h文件为Unicode编码格式。而编译Qt程序时,Unicode文件格式可能会导致编译失败。因此需要将Unicode编码的文件转换为UTF-8编码格式。
解决办法:
在VS中将上述项目关闭,将Unicode编码的文件用Notepad++文本编辑软件打开,选择“编码->使用UTF-8编码”,然后重新保存文件。再次在VS中打开上述项目,发现添加Q_OBJECT后也可以成功编译、运行。