前排预警
说来话长,这是一个强迫症重症患者的犯病时刻,没用的知识又增加了。
背景
每次使用 VS 新建 Qt 项目,都会遇到这样的一个问题:
项目属性中设置了项目的中间目录后,编译程序,在项目文件夹下仍然会出现一堆 qmake 相关的中间文件。
如图:
文件路径:
- 解决方案路径:D:\Code\Test
- 项目路径:D:\Code\Test\Test
- 临时文件路径:D:\Code\Test\Temp
- qmake 相关文件的输出路径:D:\Code\Test\Test\x64\Debug\qmake\temp
what !什么情况!我明明设置了中间路径,为啥又冒出来这一堆玩意?
先不管这一堆文件是干啥的,就这些,强迫症真的受不了这些,于是开始了探究之路。
问题探究
为什么会出现这样的问题?在 VS 的属性菜单中找了好久好久,真的没有发现相关能设置的东西。
搜索之际,在 stackoverflow 上发现了一个网友的问答:stackoverflow 回答
看了下网友的回答,意思就是在项目的 .vcxproj 文件中,先引用了 QtMsBuild 的一个文件,然后再引用了我们在项目配置中设置的输出路径。
我的项目文件 Test.vcxproj:
看了一下还真是这样,先引用了 $(QtMsBuild)\Qt.props 文件,然后再引用 Configuration 属性设置。
那就把 Configuration 属性设置的这一段移动到引用 $(QtMsBuild)\Qt.props 文件的那一段上面。
试了一下,还真的可以,那一堆文件生成路径真的变成了我前面设置的路径。
但是,难道每次新建项目都要这么手动修改么,有没有简单点的办法?
看一下 $(QtMsBuild)\Qt.props 文件,我的电脑中,这个文件在 C:\Users\MC\AppData\Local\Microsoft\VisualStudio\15.0_a8a73fe4\Extensions\sdkitjev.5yl\QtMSBuild 路径下面。
打开看一下 Qt.props 文件,里面引用了 qt_private.props 文件。
打开看一下 qt_private.props 文件,发现里面定义了 QtVarsOutputDir。
这个 QtVarsOutputDir 变量就是 qmake 相关文件的生成路径,把 “qmake” 改成 “xxx”,编译一下程序,确实文件夹的名称变成了 “xxx”。
$(IntDir) 就是我们设置的中间路径,默认值是 $(Platform)$(Configuration)\,这个文件先引用的,后面再修改 Configuration 属性设置已经晚了,所以 qmake 相关的临时文件就生成在了 D:\Code\Test\Test\x64\Debug\qmake\temp 文件夹下。
就这么简单就可以解决了?不是的。
这个 QtMsBuild 文件夹下的文件是临时文件,下次还是会重置的,所以这也不是终极解决方案。
那要怎么解决?是不是修改 VS 的 .vcxproj 文件生成逻辑就可以了?
查了下资料,项目的生成是靠着 VS 中的一些模板生成的。
那我新建的 Qt 程序的模板在哪里?当然是我安装 Qt VS Tools 插件的目录下,找一下我的插件目录。
我用的是 VS 2017,插件路径是 C:\Users\MC\AppData\Local\Microsoft\VisualStudio\15.0_a8a73fe4\Extensions\sdkitjev.5yl。
后面有个文件夹 ProjectTemplates\VC\Qt\1033,这里面的文件夹和新建 Qt 项目的模板一一对应。
gui 文件夹对应的就是 Qt Widgets Application 这个模板,里面有个文件 gui.vcxproj,简单看一下其中的一段:
这里面的东西,真的和我们新建出来的 Test.vcxproj 项目文件一一对应,看来这就是我们寻找的项目模板文件,只要把这个模板文件修改了,问题就应该可以解决了。
解决方案
观察下我们的 Test.vcxproj 文件,引用 $(QtMsBuild)\Qt.props 文件的那一段对应的是 $ PropertySheets $,引用 Configuration 属性设置的那一段对应的就是 $ Properties $,把它移动到上面就好了。
同理,再修改其他模板文件就可以了。
(在插件重新安装,或者更新之后,这些文件的修改应该会被重置,未实测)