2014-01-14 32 views
8

我使用Visual C++ 2012和一個大量使用預編譯頭文件的項目。臭名昭着的/Zm交換機正在使用中。如何處理預編譯頭隨機在已取消的構建中損壞?

當我取消正在進行的構建,我有時會收到此錯誤的未來建設:

error C1852: 'foo.pch' is not a valid precompiled header file 

十之八九的,事情會順利,但是當這發生了,我必須要找到。並在重新構建之前手動刪除它。

這讓我很煩惱。有沒有辦法來防止這種情況發生?來自微軟的補丁?或者強制Visual刪除.pch並在出現問題時自動重新啓動構建的方法?或者我沒有想過的其他解決方案?

編輯:這裏是視覺我運行的版本:

Microsoft Visual Studio Professional 2012 
Version 11.0.61030.00 Update 4 
+0

我刪除了C++標記,因爲這是一個特定於編譯器的問題而不是語言問題。 –

+5

@MarkB我不同意,可能有更多的人,他們也很熟悉VC,他們監視C++標記的人比監視這些編譯器特定標記的人要多。回滾到rev 1. – Praetorian

+1

不重建會殺死pch文件嗎?如果我得到任何pch錯誤,我只是打重建。 –

回答

0

我跟着rockeye的建議試圖找到這些損壞的文件中的模式。結果非常簡單:有效文件以VCPCH0標題開頭,損壞的文件不能。

簡單的C#程序作爲失敗項目的預構建事件運行並刪除損壞的文件可解決問題。如果有人有興趣,來源是right here

1

這是一個純粹的猜測,因爲我沒有遇到這個問題。

嘗試瞭解視覺檢測.pch文件是如何損壞的(即空文件,文件未正確結束,...)。如果它遵循明確的模式,則編寫一個預生成腳本,用於解析所有.pch並刪除損壞的腳本。

+0

他已經說過沒有我認爲的模式 –

+0

不,不,可能有一個模式,也許該文件畢竟是純粹的空白,有一個可疑的小尺寸。我會研究一下。好主意! –

1

我會創建一個腳本,試圖重新編譯stdafx.cpp文件,但這次使用PCH而不是生成它。即預期的結果是成功編譯一個空文件。如果失敗,請刪除PCH。現在將此腳本作爲預構建步驟運行。

這聽起來相當昂貴,但它非常可靠。加載PCH的任何問題都會導致其再生,甚至編譯器升級。此外,您的PCH現在在文件緩存中,這意味着實際使用稍微便宜一些。

這可能是作爲一個NMAKE構建腳本實現的,有一些不尋常的規則。

+0

這聽起來像一個很好的解決方法,如果我找不到任何模式,我只需要看看.pch預檢是多麼昂貴。 –

+0

如果通過NMAKE完成,當您創建一個小的.OK文件(如果PCH文件通過此測試)時,它可能會相當快。只要.OK文件比.PCH更新,就不需要重新檢查.PCH – MSalters