1. 程式人生 > >error無法開啟預編譯標頭檔案的解決方法及預編譯頭原理

error無法開啟預編譯標頭檔案的解決方法及預編譯頭原理

1。用VC.NET編輯程式,按Ctrl+F7,出現下列錯誤:
fatal error C1083: 無法開啟預編譯標頭檔案:“Debug/UGFace.pch”: No such file or directory
解決方法:修改:專案->屬性->C/C++ ->預編譯頭->不使用預編譯頭 即可。


2。學用Visual C++ 6.0的第一個例程就讓我出了錯.用嚮導生成第一個基於對話方塊的Project之後,當我按照書上的源程式一個字一個字地輸進去之後,始終有一個錯誤:
fatal error C1010: unexpected end of file while looking for precompiled header directive.找了無數次之後,我決定把嚮導生成的包括標頭檔案的語句:include"StdAfx.h"保留(而這之前我是把它刪掉了的,因為書上的例子沒有這句.)咦,這下就對了.這是為什麼呢?我百思不得其解。
來到我的VC原始碼目錄,我注意到每個Project下面的DEBUG資料夾都特別大,而且一個副檔名為 .pch的檔案佔去了絕大部分,我刪掉之好像對程式編譯執行沒有什麼影響。於是抱著對.pch檔案的好奇,我在網上搜到了我疑惑之處的解答。這就是VC++6.0給我們帶來的:預編譯標頭檔案。預編譯標頭檔案(一般副檔名為.PCH),是把一個工程中較穩定的程式碼預先編譯好放在一個檔案(.PCH)裡。這些預先編譯好的程式碼可以是任何的C/C++程式碼,甚至可以是inline函式,只是它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的程式碼。
為什麼需要預編譯標頭檔案?
一言以蔽之:提高編譯速度.一般地,編譯器以檔案為單位編譯。如果修改了一工程中的一個檔案則所有檔案都要重新編譯,包括標頭檔案裡的所有東西(eg.Macro巨集,Preprocessor預處理),而VC程式中,這些標頭檔案中所包括的東西往往是非常大的,編譯之將佔很長的時間。但它們又不常被修改,是較穩定的,為單獨的一個小檔案而重新編譯整個工程的所有檔案導致編譯效率下降,因此引入了.PCH檔案。
如何使用預編譯標頭檔案以提高編譯速度?
要使用預編譯標頭檔案,必須指定一個頭檔案(.H),它包含我們不會經常修改的程式碼和其他的標頭檔案,然後用這個標頭檔案來生成一個預編譯標頭檔案(.PCH),VC預設的標頭檔案就是StdAfx.h,因為標頭檔案是不能編譯的,所以我們還需要一個.CPP檔案來作橋樑,VC預設的檔案為StdAfx.cpp,這個檔案裡只有一句程式碼就是:#include "StdAfx.h"。接下來要用它生成.PCH檔案,涉及到幾個重要的預編譯指令:/Yu,/Yc,/Yx,/Fp。簡單地說,/Yc是用來生成.PCH檔案的編譯開關。在Project->setting->C/C++的Category裡的Precompiled Header,然後在左邊的樹形檢視中選擇用來編譯生成.PCH檔案的.CPP檔案(預設即StdAfx.cpp),你就可以看到/Yc這個開關,它表示這個檔案編譯了以後是否生成.PCH檔案(可能/Yc的c表示create)。/Fp指令指定生成的.PCH檔案的名字及路徑(可能/Fp的p代表path)。/Yu的u即use,工程中只要包括了.H檔案的檔案都會有這個/Yu指令。如果選擇自動Automatic...的話則原來為/Yc的地方就換成了/Yx指令。如果選擇自動,則每次編譯時編譯器會看以前有沒有生成過.PCH檔案,有則不現生成否則就再次編譯產生.PCH檔案。
注意:
A,實際上,由Appzard專案嚮導生成的預設的標頭檔案及CPP檔案StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡單。但如果你要這樣做就要記得修改相應的Project->setting...下的幾個預編譯指(/Yc,/Yu,/Yx,/Fp)的引數。
B.在任何一個包括了將要預編譯的標頭檔案而使用了.PCH檔案的工程檔案的開頭,一定必須要是在最開頭,你要包含那個指定生成.PCH檔案的.H檔案(通過.CPP檔案包括,預設為StdAfx.cpp),如果沒包括將產生我最開頭產生的錯誤.如果不是在最開頭包括將產生讓你意想不到的莫名其妙錯誤,如若不信,盍為試之?
C.預編譯檔案.PCH生成之很耗時間,而且生成之後它也很佔磁碟空間,常在5-6M,注意專案完成之後及時清理無用的.PCH檔案以節約磁碟空間。
D.如果丟了或刪了.PCH檔案而以後要再修改工程檔案時,可將指定的/Yc的.CPP檔案(預設為StdAfx.cpp)重新編譯一次即可再次生成.PCH檔案,不用傻傻的按F7或Rebuild All


以前還碰到過另外一種情況:新建一個工程,隨便找一個cpp檔案,按ctrl+f7系統將會提示:fatal error C1083: 無法開啟預編譯的標頭檔案:”Debug/xxx.pch”: No such file or directory(其中xxx是工程的名字)這種情況也是一樣的原因,為vc的stdafx.h標頭檔案未編譯所致。也可以這樣解決:先F7,編譯後再ctrf+f7。

注意:VS智慧裝置程式(如WM5)預編譯標頭檔案為stdafx.h。更改設定在專案->XXXX屬性->配置屬性->C/C++->預編譯頭 的右側第一項