1. 程式人生 > 實用技巧 >修復被破壞的 vs 工程設定(續)

修復被破壞的 vs 工程設定(續)

修復被破壞的 vs 工程設定(續)

排錯除錯vsbcginclude path

緣起

在上一篇文章——《修復被破壞的 vs 工程設定》中,我分享了修復被破壞的 vs 工程設定的實戰。本以為圓滿解決了問題,沒想到另有玄機。所以又來分享一篇刨根問底的文章。

檢視檔案

開啟 Microsoft.Cpp.Win32.user.props 一看,裡面並沒有任何有用的內容!如下圖:


Microsoft.Cpp.Win32.user.props

看來,預設的 包含目錄庫目錄 的值不是從這裡來的!雖然可以在這裡新增自定義的值。對比看一下 vs 工程設定中的 包含目錄庫目錄 的值,如下圖:


vs-project-include-path

顯然,包含目錄庫目錄 的值不為空。接下來的任務是調查到這兩個值是從哪裡來的(只看包含目錄的值就可以了,庫目錄的值可以用類似的方法查)。應該根據什麼線索來調查呢?

還是搜尋

包含目錄的值應該儲存在某個地方(配置檔案或者登錄檔),不能憑空出來這麼一個東東。還是優先在本地硬碟搜尋,繼續使用 File Locator,搜尋 WindowsSDK_IncludePath


search-result-of-WindowsSDK_IncludePath

有很多條記錄。因為我使用的是 vs2013,對應的版本是 v120,從搜尋結果中的檔案路徑可以猜測,ARM

是編譯 ARM 平臺程式用的,Win32 是編譯 32 位程式用的,x64 是編譯 64 位程式用的。所以,我嚴重懷疑上圖中高亮的這條記錄。修改這個檔案的內容(需要管理員許可權),如下圖:


modify-IncludePath-value-in-toolset.props

vs 中驗證一下,開啟之前的工程,檢視對應的工程屬性,如下圖:


inspect-modified-include-path-in-vs

果然已經變成了修改後的值,說明猜對了!至此,我們已經知道包含目錄的值是從 Toolset.props 中獲取的,是由 $(VC_IncludePath)$(WindowsSDK_IncludePath)

組成的,那這兩個巨集的值是從哪裡來的呢?我以追查 WindowsSDK_IncludePath 的值為例展開。

WindowsSDK_IncludePath

繼續使用 File Locator 繼續搜尋,搜尋結果如下圖:


search-WindowsSDK_IncludePath-in-file

看了一圈,只有 C:\Program Files (x86)\Windows Kits\8.1\DesignTime\CommonConfiguration\Neutral\Windows.props 檔案比較可能是定義 WindowsSDK_IncludePath 的地方。其它幾個檔案都是在使用。

修改 Windows.props 中的 WindowsSDK_IncludePath 為空(需要管理員許可權),如下圖:


clear-WindowsSDK_IncludePath-in-Windows.props

再次使用 vs 開啟工程檔案,檢視包含路徑的值,果然是我們修改後的值。


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 的環境變數,結果會是什麼樣的呢?請看下面的視訊:


set-incluepath-environment-variable

看來,確實可以通過環境變數來設定 vs 中的巨集。

總結

  • .props 檔案中可以設定一些預定義的值,在 .vcxproj 檔案中 import 對應的 .props 檔案即可使用。
  • 我們可以通過環境變數的值設定 vs 中使用的巨集的值。
  • 搜尋檔案內容,請用 File Locator

參考資料

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