修复被破坏的 vs 工程设置(续)

排错调试vsbcginclude path

缘起

在上一篇文章——​​《修复被破坏的 vs 工程设置》​​​中,我分享了修复被破坏的 ​​vs​​ 工程设置的实战。本以为圆满解决了问题,没想到另有玄机。所以又来分享一篇刨根问底的文章。

查看文件

打开 ​​Microsoft.Cpp.Win32.user.props​​ 一看,里面并没有任何有用的内容!如下图:

修复被破坏的 vs 工程设置(续)_microsoft

Microsoft.Cpp.Win32.user.props

看来,默认的 ​​包含目录​​ 和 ​​库目录​​ 的值不是从这里来的!虽然可以在这里添加自定义的值。对比看一下 ​​vs​​ 工程设置中的 ​​包含目录​​ 和 ​​库目录​​ 的值,如下图:

修复被破坏的 vs 工程设置(续)_microsoft_02

vs-project-include-path

显然,​​包含目录​​ 和 ​​库目录​​ 的值不为空。接下来的任务是调查到这两个值是从哪里来的(只看​​包含目录​​的值就可以了,​​库目录​​的值可以用类似的方法查)。应该根据什么线索来调查呢?

还是搜索

​包含目录​​的值应该保存在某个地方(配置文件或者注册表),不能凭空出来这么一个东东。还是优先在本地硬盘搜索,继续使用 ​​File Locator​​,搜索 ​​WindowsSDK_IncludePath​​。

修复被破坏的 vs 工程设置(续)_环境变量_03

search-result-of-WindowsSDK_IncludePath

有很多条记录。因为我使用的是 ​​vs2013​​,对应的版本是 ​​v120​​,从搜索结果中的文件路径可以猜测,​​ARM​​ 是编译 ​​ARM​​ 平台程序用的,​​Win32​​ 是编译 ​​32​​ 位程序用的,​​x64​​ 是编译 ​​64​​ 位程序用的。所以,我严重怀疑上图中高亮的这条记录。修改这个文件的内容(需要管理员权限),如下图:

修复被破坏的 vs 工程设置(续)_microsoft_04

modify-IncludePath-value-in-toolset.props

在 ​​vs​​ 中验证一下,打开之前的工程,查看对应的工程属性,如下图:

修复被破坏的 vs 工程设置(续)_环境变量_05

inspect-modified-include-path-in-vs

果然已经变成了修改后的值,说明猜对了!至此,我们已经知道​​包含目录​​的值是从 ​​Toolset.props​​ 中获取的,是由 ​​$(VC_IncludePath)​​ 和 ​​$(WindowsSDK_IncludePath)​​ 组成的,那这两个宏的值是从哪里来的呢?我以追查 ​​WindowsSDK_IncludePath​​ 的值为例展开。

WindowsSDK_IncludePath

继续使用 ​​File Locator​​ 继续搜索,搜索结果如下图:

修复被破坏的 vs 工程设置(续)_环境变量_06

search-WindowsSDK_IncludePath-in-file

看了一圈,只有 ​​C:\Program Files (x86)\Windows Kits\8.1\DesignTime\CommonConfiguration\Neutral\Windows.props​​ 文件比较可能是定义 ​​WindowsSDK_IncludePath​​ 的地方。其它几个文件都是在使用。修改 ​​Windows.props​​ 中的 ​​WindowsSDK_IncludePath​​ 为空(需要管理员权限),如下图:

修复被破坏的 vs 工程设置(续)_环境变量_07

clear-WindowsSDK_IncludePath-in-Windows.props

再次使用 ​​vs​​ 打开工程文件,查看包含路径的值,果然是我们修改后的值。

修复被破坏的 vs 工程设置(续)_搜索_08

modified_include_path_value_in_vs


More

如果你足够细心,会发现在确定 ​​IncludePath​​ 的值的时候,只有当 ​​IncludePath​​ 是空的时候,才会使用配置文件中对应的值。我把 ​​Toolset.props​​ 中的关键语句粘贴如下:

<IncludePath Condition="'$(IncludePath)' == ''">$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>

​Condition="'$(IncludePath)' == ''"​​ 表示,当 ​​$(IncludePath)​​ 的值是空才取后面的值。如果 ​​IncludePath​​ 不为空,就不会取后面的值了。​​IncludePath​​ 可能会在哪里被赋值呢?我们可以自己设置 ​​IncludePath​​ 的值吗?答案是肯定的。如果有一个名为​​IncludePath​​ 的环境变量,结果会是什么样的呢?请看下面的视频:

修复被破坏的 vs 工程设置(续)_环境变量_09

set-incluepath-environment-variable

看来,确实可以通过环境变量来设置 ​​vs​​ 中的宏。

总结


  • .props
    文件中可以设置一些预定义的值,在 .vcxproj
    文件中 import
    对应的 .props
    文件即可使用。
  • 我们可以通过环境变量的值设置 vs
    中使用的宏的值。
  • 搜索文件内容,请用 File Locator

参考资料

《Inside the Microsoft Build Engine —— Using MSBuild and Team Foundation Build》



欢迎各位小伙伴指出不足,提出建议!感谢关注我的博客:)


作 者:编程难