qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7
vs2013 + qt add-in 2.3.2
起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001
一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因为有Git,可以看到.vcxproj文件里被删掉了一部分文件正是Generated Files里缺少的,随即将.vcxproj还原,但这些文件竟然跑到了Header Files和Source Files下面,而且编译仍然是报错的
这种情况以前也发生过几次,貌似都是发生在把文件拖进项目或者从VS里删除文件,只要这个文件包含Q_OBJECT声明的就会出事,但一般只影响某一个类,不会涉及其它,这时候只要把类的.cpp、.h、.ui文件从项目移除再重新添加就可以编译了
这次是导致大量类的生成文件都炸了,可能是QT元对象系统和VS这两干架了出BUG了,导致VS项目的.vcxproj和.vcxproj.filters全乱套了!
尝试急救:先把所有的moc_和ui_文件还有一个“qrc_项目名.cpp”文件从项目移除(包括Generated Files下面的),清理项目,重新编译,此时虽然GeneratedFiles文件夹里生成了moc_和ui_文件,但这些文件并不会自动添加至项目里(即VS界面上的Generated Files仍然是空的);此时再手动将生成的文件按照GeneratedFiles、GeneratedFiles\Debug、GeneratedFiles\Release各自拖到VS项目里,这样就可以正常编译了
如果用了Git注意新添加进来的文件会被识别为变更,要自行排除掉
彩蛋:上面moc_和ui_文件跑到Header Files和Source Files下的原因可能出在.vcxproj.filters文件里的UniqueIdentifier,它是VS自动生成的一个唯一识别号,一般第一次创建过滤器,以后就固定不变了。如果发生改变就无法定位过滤器,然后vs就会自动把.cpp扔到Source Files,.h扔到Header Files,可能是还原.vcxproj文件时导致UniqueIdentifier被VS改变了。实测自己手动把GeneratedFiles文件夹删掉并不会改变其UniqueIdentifier,说明跟实际的文件没关系
<Filter Include="Generated Files"><UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier><Extensions>moc;h;cpp</Extensions><ParseFiles>true</ParseFiles></Filter><Filter Include="Generated Files\Debug"><UniqueIdentifier>{d4bcdb24-fb53-4163-bbc4-ac603910a6b4}</UniqueIdentifier><Extensions>cpp;moc</Extensions><SourceControlFiles>False</SourceControlFiles></Filter><Filter Include="Generated Files\Release"><UniqueIdentifier>{a0ab4529-1ce5-4c3d-9668-2665c25dfc11}</UniqueIdentifier><Extensions>cpp;moc</Extensions><SourceControlFiles>False</SourceControlFiles></Filter>
对于Git项目,.vcxproj和.vcxproj.filters因为该问题产生的变更是无意义的,可以通过把.vcxproj和.vcxproj.filters复原为原来的版本,但不要直接在VS里还原,而是要先关闭VS,然后自己手动修改替换文件,这样是可以正常编译的