修復被破壞的 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》