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

修復被破壞的 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 是怎麼把自己加到包含目錄裡的。

追本溯源

很快腦子中浮現了兩個思路:

  1. 解除安裝 BCG
    後,重新安裝,在安裝的過程中使用 procmon 監視安裝過程中對檔案和登錄檔的寫操作。
  2. 直接在本地檔案和登錄檔中搜索包含路徑中出現的 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》