修復被破壞的 vs 工程設定
修復被破壞的 vs 工程設定
原排錯除錯vsbcginclude path緣起
前幾天開啟工作專案進行編譯,沒想到居然報錯,明明前一天編譯還正常的。簡單排查後,臨時修復了問題。但是今天新建工程時居然還有相同的問題,是可忍熟不可忍?本文記錄了排查過程,希望對各位小夥伴兒有幫助。話不多說,上菜。
初遇錯誤
不方便使用實際工程截圖,就用我新建的測試工程吧,提示的錯誤是一樣的。
compile-error-c1083-missing-SDKDDKVer
我的第一反映是,難道 SDKDDKVer.h
被意外刪掉了?趕緊使用 everything
搜一下。
search-sdk-ddk
本地有這個檔案,而且這個檔案的位置看上去沒問題,但是為什麼編譯的時候會提示找不到這個檔案呢?看看工程配置吧。
檢視工程配置
在選定的工程上右鍵,屬性
開啟工程屬性頁,並檢視 配置屬性, VC++ 目錄,包含目錄
的值,如下圖。
inspect-project-property
當看到 BCG
相關的字眼時,我突然想起來最近剛裝了 BCG
,不會是 BCG
把包含路徑給弄壞了吧?在繼續調查之前,先確認一下這些值指向的路路徑確實沒有一個路徑裡包含 SDKDDKVer.h
。
檢視包含目錄的值
在 vs
中,$()
包含的值是巨集,會展開成實際的值。點選 巨集(M)>>
,就可以檢視每個巨集對應的值了。
inspect-macro-value
經過一番檢視,確實沒有一個巨集對應的路徑包含 SDKDDKVer.h
BCG
給弄亂了!
臨時解決
因為專案比較緊,從同事那拷貝了正確的包含路徑,編譯,通過!這個問題暫時就放下了。沒想到……
再遇此錯誤
今天準備編寫簡單的測試程式碼,於是新建一個工程,沒想到編譯時有報了同樣的錯誤。
compile-error-c1083-missing-SDKDDKVer
根據上次的調查結果,是 BCG
把包含路徑給弄亂了。簡單檢視工程屬性中的包含路徑確認了這點。
新建工程也出了同樣的問題,說明修改的是公共的位置。趁著週末有時間,正好調查調查 BCG
是怎麼把自己加到包含目錄裡的。
追本溯源
很快腦子中浮現了兩個思路:
- 解除安裝
BCG
procmon
監視安裝過程中對檔案和登錄檔的寫操作。 - 直接在本地檔案和登錄檔中搜索包含路徑中出現的
BCG
相關的關鍵字。
我採用了第二個思路。先嚐試在檔案中搜索,如果搜不到再到登錄檔中搜索。說幹就幹,先在工程檔案中搜索bcgpro
,如下圖:
沒搜到,在意料之中。新建工程的時候,應該會從某個公共的位置讀到這個值。
正如我在之前文章中介紹的那樣,.vcxproj
檔案中可以通過匯入 .props
檔案引入一些屬性。基本上每個新建的工程都會有一些預設的匯入項,如下圖:
imported-props-in-vcxproj
BCG
會不會修改的這些檔案中的一個呢?請出 FileLocator
,並按下圖輸入關鍵字搜尋,很幸運,搜到了。
search-bcgpro-by-filelocator
開啟 Microsoft.Cpp.Win32.user.props
檢視,如下圖:
modified-user-props
果然被 BCG
改動過了!
徹底修復
在其它機器上找一份沒改動的檔案替換,關閉工程後再次開啟編譯,一切正常!在 vs
中新建一個工程編譯,也正常!至此,我們從根本上解決了問題!
總結
- 在
vs
中$()
包圍的值是巨集,可以展開成實際的值。 .props
可以指定一些屬性,比如增加一些自定義的包含路徑。FileLocator
搜尋檔案內容真是好用!強烈推薦!
參考資料
《Inside the Microsoft Build Engine —— Using MSBuild and Team Foundation Build》