修复被破坏的 vs 工程设置(续)
緣起
在上一篇文章——《修復被破壞的 vs 工程設置》中,我分享了修復被破壞的 vs 工程設置的實戰。本以為圓滿解決了問題,沒想到另有玄機。所以又來分享一篇刨根問底的文章。
查看文件
打開 Microsoft.Cpp.Win32.user.props 一看,里面并沒有任何有用的內容!如下圖:
看來,默認的 包含目錄 和 庫目錄 的值不是從這里來的!雖然可以在這里添加自定義的值。對比看一下 vs 工程設置中的 包含目錄 和 庫目錄 的值,如下圖:
顯然,包含目錄 和 庫目錄 的值不為空。接下來的任務是調查到這兩個值是從哪里來的(只看包含目錄的值就可以了,庫目錄的值可以用類似的方法查)。應該根據什么線索來調查呢?
還是搜索
包含目錄的值應該保存在某個地方(配置文件或者注冊表),不能憑空出來這么一個東東。還是優先在本地硬盤搜索,繼續使用 File Locator,搜索 WindowsSDK_IncludePath。
有很多條記錄。因為我使用的是 vs2013,對應的版本是 v120,從搜索結果中的文件路徑可以猜測,ARM 是編譯 ARM 平臺程序用的,Win32 是編譯 32 位程序用的,x64 是編譯 64 位程序用的。所以,我嚴重懷疑上圖中高亮的這條記錄。修改這個文件的內容(需要管理員權限),如下圖:
在 vs 中驗證一下,打開之前的工程,查看對應的工程屬性,如下圖:
果然已經變成了修改后的值,說明猜對了!至此,我們已經知道包含目錄的值是從 Toolset.props 中獲取的,是由 $(VC_IncludePath) 和 $(WindowsSDK_IncludePath) 組成的,那這兩個宏的值是從哪里來的呢?我以追查 WindowsSDK_IncludePath 的值為例展開。
WindowsSDK_IncludePath
繼續使用 File Locator 繼續搜索,搜索結果如下圖:
看了一圈,只有 C:\Program Files (x86)\Windows Kits\8.1\DesignTime\CommonConfiguration\Neutral\Windows.props 文件比較可能是定義 WindowsSDK_IncludePath 的地方。其它幾個文件都是在使用。
修改 Windows.props 中的 WindowsSDK_IncludePath 為空(需要管理員權限),如下圖:
再次使用 vs 打開工程文件,查看包含路徑的值,果然是我們修改后的值。
More
如果你足夠細心,會發現在確定 IncludePath 的值的時候,只有當 IncludePath 是空的時候,才會使用配置文件中對應的值。我把 Toolset.props 中的關鍵語句粘貼如下(可以左右拖動查看):
<IncludePath?Condition="'$(IncludePath)'?==?''">$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>Condition="'$(IncludePath)' == ''" 表示:當 $(IncludePath) 的值是空才取后面的值。如果 IncludePath 不為空,就不會取后面的值了。
IncludePath 可能會在哪里被賦值呢?我們可以自己設置 IncludePath 的值嗎?答案是肯定的。
如果有一個名為IncludePath 的環境變量,結果會是什么樣的呢?請看下面的視頻:
看來,確實可以通過環境變量來設置 vs 中的宏。
總結
.props 文件中可以設置一些預定義的值,在 .vcxproj 文件中 import 對應的 .props 文件即可使用。
我們可以通過環境變量的值設置 vs 中使用的宏的值。
搜索文件內容,請用 File Locator。
參考資料
《Inside the Microsoft Build Engine —— Using MSBuild and Team Foundation Build》
歡迎留言交流!
感謝你的分享,點贊和在看
總結
以上是生活随笔為你收集整理的修复被破坏的 vs 工程设置(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堪称艺术品级的应用开发框架,Abp有望超
- 下一篇: 工作十余年,还是一直被问 委托和事件 有