1>TraceTest.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall TraceTest::metaObject(void)const " (?metaObject@TraceTest@@UBEPBUQMetaObject@@XZ)
1>TraceTest.obj : error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall TraceTest::qt_metacast(char const *)" (?qt_metacast@TraceTest@@UAEPAXPBD@Z)
1>TraceTest.obj : error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall TraceTest::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@TraceTest@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>..\..\env_debug\PST6747AClient.exe : fatal error LNK1120: 3 个无法解析的外部命令
原因:
1、创建类时没有继承QObject, 编译时没有生成对应的“moc_头文件名"文件
2、手动添加QObject后编译,不再生成“moc_头文件名"文件
解决办法:
1、清理项目
2、执行qmake
3、重新生成项目
_______________________________________________________________________
VS + Qt开发过程中有时候会新增一个QtClass(带Q_OBJECT定义的类时),发现编译无法通过,可能会出现LNK2001 的错误,这是由于IDE没有自动为新建的类生成 moc_XXXX.cpp 文件导致的。网上很多博客上写使用moc命令来解决,但是这样的话,如果多人开发的话,在你电脑上能变过,moc_XXXX.cpp我们一般都不提交,那么别人有可能也会遇到这种情况。那咱们来找一下造成这种现象的原因吧,这样一次解决就ok了。
咱们先打开工程对应的xxxx.vcxproj(可以使用notepad++打开修改),对比别的正常的Qt头文件,就会发现,你这个异常的头文件程序把它当成了一个普通的C++class,
正常的Qt 类对应的头文件
<ItemGroup>
<QtMoc Include="xxxx1.h /">
<QtMoc Include="xxxx2.h /">
<QtMoc Include="xxxx3.h /">
</ItemGroup>
你新建有问题的类的头文件
<ItemGroup>
<ClCompile Include="xxxx4.h /">
</ItemGroup>
看到上面没,你的新建的Qt 类误认为是普通的C++类,所以不会生成对应的moc文件,那咱们改一下就可以了,把当成C++普通类的部分删除,将这个加入到QtMoc中就可以了
修改后的:
<ItemGroup>
<QtMoc Include="xxxx1.h /">
<QtMoc Include="xxxx2.h /">
<QtMoc Include="xxxx3.h /">
<QtMoc Include="xxxx4.h /">
</ItemGroup>
这还没完,咱们还要修改工程对应的xxxx.filters文件:
格式有一点微小的改变,这里面就不做详细的说明了,照着下面修改下:
<ItemGrop>
<QtMoc Include="xxxx1.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="xxxx2.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="xxxx3.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtMoc Include="xxxx4.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGrop>
到此,修改完成,重新编译一下就可以了
————————————————
版权声明:本文为CSDN博主「逝水流年丶轻染尘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_18286031/article/details/107985433