VS2008中"fatal error C1083:無法打開包括文件:“Stdafx.h”: No such file or directory”

錯誤類型1:

環境:VS2008

語言:C++

     下午出了一個非常可惡的問題,我的一個基於MFC 對話框的程序因爲預編譯頭文件stdafx.h的原因始終無法編譯通過。 由於程序整體是需要預編譯頭文件的。因此工程內所有cpp文件通通都包括了#include stdafx.h。

     我自己寫的文件放在工程文件夾下自建的一個文件夾裏。比如工程名DynamicPathPlan, 我的文件SamplePredictModel.h、SamplePredictModel.cpp放在 "C:/當前的實際機器人代碼/DynamicPathPlan_SelfLoc/DynamicPathPlan/SelfLoc"文件夾裏面。而MFC自動生成的stdafx.h是放在工程文件夾下面。同時在SelfLoc文件夾下面還有若干自己寫的類文件。其他的類中cpp文件也都有#include stdafx.h,而且都沒有錯。獨獨是這麼一個文件SamplePredictModel.cpp 中報錯:"fatal error C1083: 無法打開包括文件:“Stdafx.h”: No such file or directory"( 我不明白爲什麼它報錯,同一目錄下其他的文件都沒有報錯,當然如果在同目錄這些正常的文件上嘗試通過右擊"#include stdafx.h"以打開stdafx.h是不能打開的)。

     如果在工程屬性中設置不使用預編譯頭當然是可以避免這一問題的,但是僅僅因爲這一個文件就要去掉所有其他文件中的stdafx.h 實在不划算,而且對話框文件中還是需要stdafx.h的。因此工程部使用預編譯頭是不行的。 我嘗試將包含語句改爲 #include ../stdafx.h VC報錯說是我沒有添加stdafx.h。失敗。網上找了n多看,都不得要領。 正好想到解決方案管理器中可以給每個文件設置是否使用預編譯頭。 因此將整個工程設爲使用預編譯頭,再將SamplePredictModel.cpp 單獨設爲不使用預編譯頭。然後刪掉#include ../stdafx.h。 於是。。。。整個世界清靜了。。。。編譯通過。 結論1. 工程屬性中的預編譯頭設置相當於給所有工程中的文件都進行了同樣設置。 然而我們自己給文件再更改它的設置,從而實現了僅單個文件不使用預編譯頭。

錯誤類型2:

用VS2008創建了一個工程,具體是啥忘記了,

編譯時出現
fatal error C1083: 無法打開預編譯運行頭文件:“Debug\xxxx.pch”: No s.........

Method1,rebuild all 

Method2,項目-〉屬性-〉C/C++ -〉預編譯頭,修改 創建/使用預編譯頭 爲 創建預編譯頭.
VC.net中:修改:項目->屬性->C/C++ ->預編譯頭->不使用預編譯頭
謝謝,我重新生成後,這個Error就沒有了 
謝謝各位朋友指點
VC默認在編譯StdAfx.cpp時生成預編譯頭文件,編譯其它cpp時使用預編譯頭文件,先編譯一下StdAfx.cpp即可.
 

錯誤類型3:

但是在vs2008裏面卻發現:

fatal error C1083: 無法打開預編譯頭文件:“Debug\t.pch”: No such file or directory

本來就是一個很小的程序,自己在網上查了一下,還是不行。不得已向高手請教,可是高手卻沒空。自己就摸索着弄了起來,最後終於解決了,爽啊!

自己總結一下:

在MSDN中是這樣說的:


其實大部分原因是第一條文件不存在,我的那個問題就是輸入第一類。這裏要涉及編譯頭的概念(以下是轉載)

預編譯頭的概念:

所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裏(通常是

以.pch爲擴展名的),這個文件就稱爲預編譯頭文件這些預先編譯好的代碼可以是任何的

C/C++代碼--------甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會

被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編

譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6-7M大。注意及

時清理那些沒有用的預編譯頭文件。

也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它

只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過

的文件。那麼爲什麼還要預編譯頭文件呢?答案在這裏,我們知道編譯器是以文件爲單

位編譯的,一個文件經過修改後,會重新編譯整個文件,當然在這個文件裏包含的所有

頭文件中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯頭文件

保存的正是這部分信息。以避免每次都要重新處理這些頭文件。

預編譯頭的作用:

根據上文介紹,預編譯頭文件的作用當然就是提高便宜速度了,有了它你沒有必要每次

都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。

預編譯頭的使用:

要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的

代碼和其他的頭文件,然後我們用這個頭文件來生成一個預編譯頭文件(.pch文件)

想必大家都知道 StdAfx.h這個文件。很多人都認爲這是VC提供的一個“系統級別”的

,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個

典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因爲AppWizard

會爲我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們

會發現這個頭文件裏包含了以下的頭文件:

#include <afxwin.h> // MFC core and standard components

#include <afxext.h> // MFC extensions

#include <afxdisp.h> // MFC Automation classes

#include <afxdtctl.h> // MFC support for Internet Explorer 4

Common Controls

#include <afxcmn.h>

這些正是使用MFC的必須包含的頭文件,當然我們不太可能在我們的工程中修改這些頭文

件的,所以說他們是穩定的。

那麼我們如何指定它來生成預編譯頭文件。我們知道一個頭文件是不能編譯的。所以我

們還需要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件

裏只有一句代碼就是:#include “Stdafx.h”。原因是理所當然的,我們僅僅是要它能

夠編譯而已?D?D?D也就是說,要的只是它的.cpp的擴展名。我們可以用/Yc編譯開關來指

定StdAfx.cpp來生成一個.pch文件,通過/Fp編譯開關來指定生成的pch文件的名字。打

開project ->Setting->C/C++ 對話框。把Category指向Precompiled Header。在左邊的

樹形視圖裏選擇整個工程 

Project Options(右下角的那個白的地方)可以看到 /Fp “debug/PCH.pch”,這就是指

定生成的.pch文件的名字,默認的通常是 <工程名>.pch(我的示例工程名就是PCH)。

然後,在左邊的樹形視圖裏選擇StdAfx.cpp.//這時只能選一個cpp文件!

這時原來的Project Option變成了 Source File Option(原來是工程,現在是一個文件

,當然變了)。在這裏我們可以看到 /Yc開關,/Yc的作用就是指定這個文件來創建一個

Pch文件。/Yc後面的文件名是那個包含了穩定代碼的頭文件,一個工程裏只能有一個文

件的可以有YC開關。VC就根據這個選項把 StdAfx.cpp編譯成一個Obj文件和一個PCH文件

然後我們再選擇一個其它的文件來看看,//其他cpp文件

在這裏,Precomplier 選擇了 Use ⋯⋯⋯一項,頭文件是我們指定創建PCH 文件的stda

fx.h

文件。事實上,這裏是使用工程裏的設置,(如圖1)/Yu”stdafx.h”。

這樣,我們就設置好了預編譯頭文件。也就是說,我們可以使用預編譯頭功能了。以

下是注意事項:

1):如果使用了/Yu,就是說使用了預編譯,我們在每個.cpp文件的最開頭,我強調一遍

是最開頭,包含 你指定產生pch文件的.h文件(默認是stdafx.h)不然就會有問題。如

果你沒有包含這個文件,就告訴你Unexpected file end. 如果你不是在最開頭包含的,

你自己試以下就知道了,絕對有很驚人的效果⋯..

fatal error C1010: unexpected end of file while looking for precompiled

header directive

Generating Code...

2)如果你把pch文件不小心丟了,編譯的時候就會產生很多的不正常的行爲。根據以上

的分析,你只要讓編譯器生成一個pch文件。也就是說把 stdafx.cpp(即指定/Yc的那個

cpp文件)從新編譯一遍。當然你可以傻傻的 Rebuild All。簡單一點就是選擇那個cpp

文件,按一下Ctrl + F7就可以了。不然可是很浪費時間的哦。

 

錯誤類型4:

1、用VC.NET編輯程序,按Ctrl+F7,出現下列錯誤:

fatal error C1083: 無法打開預編譯頭文件:“Debug/UGFace.pch”: No such file or  directory 

解決方法:修改:項目->屬性->C/C++ ->預編譯頭->不使用預編譯頭 即可。

2、先打開一個以前做了一下的工程,編譯通過,能運行。我就稍微修改了一下代碼(只是修 改一個參數使寫入INI文件的整數由0變爲10),這時編譯通不過了,提示頭文件“stdafx.h”編譯錯誤(具體錯誤提示忘記了),錯誤位置指向應用程序類的源文件的語句“#include "stdafx.h"”。不包含這個文件是不行的,左看右看沒找出個原因來,甚至把代碼改回原來的樣子,還是不行。到網上一查,發現這麼一段話:


學用Visual C++ 6.0的第一個例程就讓我出了錯.用嚮導生成第一個基於對話框的Project之後,我按照書([Visual C++面向對象與可視化程序設計(第二版)]清華大學出版社pp76)上的例子開始了我的第一個程序,當我按照書上的源程序一個字一個字地輸進去之後,始終有一個錯誤:fatal error C1010: unexpected end of file while looking for precompiled header directive.找了無數次之後,我決定把嚮導生成的包括頭文件的語句:include"StdAfx.h"保留(而這之前我是把它刪掉了的,因爲書上的例子沒有這句.)咦,這下就對了.這是爲什麼呢?我百思不得其解.

    來到我的VC源代碼目錄,我注意到每個Project每個Project下面的DEBUG文件夾都特別大,而且一個擴展名爲 .pch的文件佔去了絕大部分,我刪掉之好像對程序編譯運行沒有什麼影響.於是抱着對.pch文件的好奇,我在網上搜到了我疑惑之處的解答.這就是VC++6.0給我們帶來的:預編譯頭文件.預編譯頭文件(一般擴展名爲.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)裏.這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只是它們在整個工程中是較爲穩定的,即在工程開發過程中不會經常被修改的代碼.

    爲什麼需要預編譯頭文件?

    一言以蔽之:提高編譯速度.一般地,編譯器以文件爲單位編譯,如果修改了一工程中的一個文件則所有文件都要重新編譯,包括頭文件裏的所有東西(eg.Macro宏,Preprocessor預處理),而VC程序中,這些頭文件中所包括的東西往往是非常大的,編譯之將佔很長的時間.但它們又不常被修改,是較穩定的,爲單獨的一個小文件而重新編譯整個工程的所有文件導致編譯效率下降,因此引入了.PCH文件.

    如何使用預編譯頭文件以提高編譯速度?

    要使用預編譯頭文件,必須指定一個頭文件(.H),它包含我們不會經常修改的代碼和其他的頭文件,然後用這個頭文件(.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

 

    照這麼說,我這種情況只要重新將“StdAfx.cpp”編譯一下就可以了,一試,馬上能編譯運行了。心裏不知道有多高興,因爲以前碰到過幾次這樣的問題都不知道怎麼解決,只好重新創建一個相同的工程。
    以前還碰到過另外一種情況(早就解決了的):新建一個工程,隨便找一個cpp文件,按ctrl+f7系統將會提示:fatal error C1083: 無法打開預編譯的頭文件:”Debug/xxx.pch”: No such file or directory(其中xxx是工程的名字)這種情況也是一樣的原因,爲vc的stdafx.h頭文件未編譯所致。也可以這樣解決:先F7,編譯後再ctrf+f7。
    看來什麼東西都要從原理入手,才能更容易地解決;

錯誤類型5:

預編譯頭文件

今天在改一個很大的程序,慢慢看,慢慢改。突然發現一個.c文件,裏面什麼也沒有,

就幾個頭文件,我一看,我靠,這不是把簡單的問題搞複雜了嗎,隨手刪掉那個c文件。

結果不能編譯了,我靠:

fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':

No such file or directory

怎麼rebuild all都不行。

上網查了一下,才搞懂了:

----------------總結------

如果工程很大,頭文件很多,而有幾個頭文件又是經常要用的,那麼

1。把這些頭文件全部寫到一個頭文件裏面去,比如寫到preh.h

2。寫一個preh.c,裏面只一句話:#include "preh.h"

3。對於preh.c,在project setting裏面設置creat precompiled headers,對於其他

.c文件,設置use precompiled header file

//

哈哈

我試了一下,效果很明顯,不用precompiled header,編譯一次我可以去上個廁所,用

precompiled header,編譯的時候,我可以站起來伸個懶腰,活動活動就差不多啦

---------轉載的文章----------

預編譯頭的概念:

所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裏(通常是

以.pch爲擴展名的),這個文件就稱爲預編譯頭文件這些預先編譯好的代碼可以是任何的

C/C++代碼--------甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會

被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編

譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6-7M大。注意及

時清理那些沒有用的預編譯頭文件。

也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它

只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過

的文件。那麼爲什麼還要預編譯頭文件呢?答案在這裏,我們知道編譯器是以文件爲單

位編譯的,一個文件經過修改後,會重新編譯整個文件,當然在這個文件裏包含的所有

頭文件中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯頭文件

保存的正是這部分信息。以避免每次都要重新處理這些頭文件。

預編譯頭的作用:

根據上文介紹,預編譯頭文件的作用當然就是提高便宜速度了,有了它你沒有必要每次

都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。

預編譯頭的使用:

要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的

代碼和其他的頭文件,然後我們用這個頭文件來生成一個預編譯頭文件(.pch文件)

想必大家都知道 StdAfx.h這個文件。很多人都認爲這是VC提供的一個“系統級別”的

,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個

典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因爲AppWizard

會爲我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們

會發現這個頭文件裏包含了以下的頭文件:

#include <afxwin.h> // MFC core and standard components

#include <afxext.h> // MFC extensions

#include <afxdisp.h> // MFC Automation classes

#include <afxdtctl.h> // MFC support for Internet Explorer 4

Common Controls

#include <afxcmn.h>

這些正是使用MFC的必須包含的頭文件,當然我們不太可能在我們的工程中修改這些頭文

件的,所以說他們是穩定的。

那麼我們如何指定它來生成預編譯頭文件。我們知道一個頭文件是不能編譯的。所以我

們還需要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件

裏只有一句代碼就是:#include “Stdafx.h”。原因是理所當然的,我們僅僅是要它能

夠編譯而已?D?D?D也就是說,要的只是它的.cpp的擴展名。我們可以用/Yc編譯開關來指

定StdAfx.cpp來生成一個.pch文件,通過/Fp編譯開關來指定生成的pch文件的名字。打

開project ->Setting->C/C++ 對話框。把Category指向Precompiled Header。在左邊的

樹形視圖裏選擇整個工程 

Project Options(右下角的那個白的地方)可以看到 /Fp “debug/PCH.pch”,這就是指

定生成的.pch文件的名字,默認的通常是 <工程名>.pch(我的示例工程名就是PCH)。

然後,在左邊的樹形視圖裏選擇StdAfx.cpp.//這時只能選一個cpp文件!

這時原來的Project Option變成了 Source File Option(原來是工程,現在是一個文件

,當然變了)。在這裏我們可以看到 /Yc開關,/Yc的作用就是指定這個文件來創建一個

Pch文件。/Yc後面的文件名是那個包含了穩定代碼的頭文件,一個工程裏只能有一個文

件的可以有YC開關。VC就根據這個選項把 StdAfx.cpp編譯成一個Obj文件和一個PCH文件

然後我們再選擇一個其它的文件來看看,//其他cpp文件

在這裏,Precomplier 選擇了 Use &8943;&8943;&8943;一項,頭文件是我們指定創建PCH 文件的stda

fx.h

文件。事實上,這裏是使用工程裏的設置,(如圖1)/Yu”stdafx.h”。

這樣,我們就設置好了預編譯頭文件。也就是說,我們可以使用預編譯頭功能了。以

下是注意事項:

1):如果使用了/Yu,就是說使用了預編譯,我們在每個.cpp文件的最開頭,我強調一遍

是最開頭,包含 你指定產生pch文件的.h文件(默認是stdafx.h)不然就會有問題。如

果你沒有包含這個文件,就告訴你Unexpected file end. 如果你不是在最開頭包含的,

你自己試以下就知道了,絕對有很驚人的效果&8943;..

fatal error C1010: unexpected end of file while looking for precompiled

header directive

Generating Code...

2)如果你把pch文件不小心丟了,編譯的時候就會產生很多的不正常的行爲。根據以上

的分析,你只要讓編譯器生成一個pch文件。也就是說把 stdafx.cpp(即指定/Yc的那個

cpp文件)從新編譯一遍。當然你可以傻傻的 Rebuild All。簡單一點就是選擇那個cpp

文件,按一下Ctrl + F7就可以了。不然可是很浪費時間的。

 

 

例如:

加了一個對話框類文件,重新編譯後出現編譯錯誤: 
d:\center\lkdraw\codlg.cpp(4)   :   fatal   error   C1083:   Cannot   open   precompiled   header   file:   'Debug/LkDraw.pch':   No   such   file   or   directory 
codlg.cpp   (4)行是如下語句:#include   "stdafx.h" 
但我的stdafx.h   文件明明在,而且其它的對話框文件一樣的寫法卻沒錯誤。 
請問如何解決? 

在菜單project-settings-c/c++   中的Project   Options   中把/Fp"Debug/LkDraw.pch"刪掉,成功搞定。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章