VS2010每次除錯都出現“此專案已經過期”提示
問題描述
最近因為專案需要,開發平臺從VS2005切換成了VS2010,把一些老專案也轉換到VS2010平臺,因為是從低到高升級,微軟還是做了很多相容,基本上可以無縫切換,編譯除錯也基本正常,但是發現有些專案(尤其是比較大的專案),剛剛編譯完畢,馬上F5啟動除錯,發現VS2010會彈出下面的框,開始以為是自己手誤,不小心改動了某個原始檔導致,後來發現每次除錯都提示,把"不再顯示此對話方塊"勾上是不是就可以了呢?框是不彈了,但是實際上還是每次重新編譯。
問題追蹤
1、首先,我開始以為是我安裝的VS2010有什麼問題,但是隨便新建的VS2010的工程正常得狠,從來沒有出現過這個問題。
2、另外,從這個提示這個來看,它是說對比上一次編譯來說,本地的原始檔過期了(就是有改動過了),如果真的改動過了,那麼這個提示是正確的,確實需要重新編譯,但是,經過多次觀察"輸出視窗"的輸出,每次重新編譯,並沒有發現有什麼檔案被重新編譯,VS2010這是在忽悠人?!
3、怒了,從一個有問題的小工程入手,一個個的排查裡面的原始檔,發現裡面一個.h標頭檔案實際上本地沒有了,但是還留在工程的編譯檔案列表裡面,而且該標頭檔案沒有任何檔案引用它了,因此編譯不會出錯,把這個不存在的檔案從檔案列表刪除了之後,這個小工程的該問題竟然就解決了。
4、後來想想,估計是VS2010畫蛇添足,編譯過程如果發現不存在的檔案,本應該警告提示該檔案不存在了,但是可能邏輯寫得有點問題,把工程標記成了過期的,導致這個框每次都彈。測試了下VS2005沒有這個問題,這也難怪為什麼很多從VS2005升級上來的工程都遇到了這個問題,因為一些大工程檔案太多了,有些無用的檔案可能本地刪除了,但是忘記從工程檔案裡面刪除了,VS2005又不提示,導致了這個問題。
解決方案
1、一種顯而易見的方案就是找到這個不存在的檔案,直接從工程的檔案列表裡面刪除即可,如果工程小,倒是可以這麼幹,如果工程很大,那就是體力活了。
2、還有一個方法是開發一個工具,解析下VS2010的vcxproj工程檔案,這是個XML檔案,解析並不困難,把裡面的檔案都校驗一下,把不存在的檔案直接找出來。
3、還是一個方法是我在網上(stackoverflow)看到的,通過DbgView工具來輸出不存在的檔案(此方法需要了解VS的devenv的配置的含義,以及一些指令碼的配置方法,我不懂,因此依葫蘆畫瓢嘗試了下,發現好用!),這種方法需要改下VS2010的IDE的配置檔案:devenv.exe.config,這個檔案的位置:此檔案在%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ 或者 %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\。
(1) 用一個文字編輯工具開啟devenv.exe.config檔案。
(2) 然後在</configSections>這行的後面新增下面的配置(注:如果是VS2012或者之後的版本value的值使用Verbose)
<system.diagnostics>
<switches>
<add name="CPS" value="4" />
</switches>
</system.diagnostics>
(3) 重啟下VS。
(4) 開啟DbgView,注意把Capture選單裡面的Capture Win32和Capture Events勾選上。
(5) 在VS裡面F5開始除錯,等"此專案已經過期"的框彈出來之後,去DbgView的輸出裡面找類似下面的輸出(如果內容很多可以直接查詢is missing或者not up to date這些關鍵字)。直接就定位到TARGETVER.H這個檔案不存在了。
[36184] Project 'D:\MyCode\Study\HelloWorld\HelloWorld.vcxproj' not up to date because build input 'D:\MYCODE\STUDY\HELLOWORLD\TARGETVER.H'; is missing.
(6) 通過這個方法可以把所有不存在的檔案都找到。