fatal error C1010: 在尋找先行編譯頭時遇到意外的檔案結尾
錯誤描述:fatal error C1010: 在尋找先行編譯頭時遇到意外的檔案結尾。是否忘記了向源中添加“#include "stdafx.h"”?
錯誤分析: 此錯誤發生的原因是編譯器在尋找先行編譯指示標頭檔(預設#include "stdafx.h")時,檔案未預期結束。沒有找到先行編譯指示資訊的標頭檔"stdafx.h"。 (因為工程中的每個cpp檔案屬性預設都是使用先行編譯頭(/YU)的,但是添加的第三方檔案並沒有 #include "stdafx.h" 先行編譯指示頭,所以編譯器在此cpp檔案中一直到末尾都沒有找到它) 我的這個問題發生於我通過添加檔案的方式,向MFC內添加現有的一大坨.h和.cpp檔案。這些.h和.cpp檔案是屬於標準C++的開源原始碼範疇,與MFC無更深層次的關係。
解決方式:一.1) 在方案總管中,右擊相應的.cpp檔案,點擊“屬性”2) 在左側配置屬性中,點開“C/C++”,單擊“先行編譯頭”3) 更改右側第一行的“建立/使用先行編譯頭”,把選項從“使用先行編譯頭(/Yu)”改成“不使用先行編譯頭”4) 註:每一個報錯的.cpp都要如此更改哦~辛苦一下唄~二.(不推薦)1)在解決方案右擊工程,點擊屬性2)在配置屬性 -> c/c++ -> 先行編譯頭 中 將 “使用先行編譯頭(/YU)” 改為 “不適用先行編譯頭”這種做法會使每次編譯過程非常緩慢
備忘:1) 貌似也可以直接在.cpp標頭檔上include stdafx.h。但沒嘗試如此修改,因為不想破壞原始碼的標準性^_^2) 感慨一下VC在識別、編譯這方面的遲滯-_-,或許是因為太強大了吧,就沒考慮周全,竟然還需要手動修改~3) 有點懷念Qt了…… 補充的資料:出處:http://blog.csdn.net/hotandhot/archive/2006/10/23/1346195.aspx
一、概念:
1、先行編譯:就是編譯器首先編譯某個檔案(稱為先行編譯標頭檔),然後將這個編譯結果儲存起來,之後如果有其他源檔案include了這個“先行編譯標頭檔”的時候,則自動從這個編譯結果提取需要的資訊進行編譯。
2、先行編譯結果檔案(Precompiled header file):就是那個用來儲存已經編譯了的符號資訊的檔案(.PCH作為尾碼)
3、產生先行編譯結果檔案(Create Precompiled header file):我們說源檔案A通過檔案B“產生先行編譯結果檔案”是指編譯A的時候將其中編譯B的編譯結果儲存成先行編譯結果檔案。一般使用嚮導的話,A檔案就是“stdafx.cpp”,B檔案是“stdafx.h”。stdafx.cpp中就一行語句:
#include “stdafx.h”
4、使用先行編譯頭(Using precompiled header):我們說某個源檔案(a.cpp)通過“stdafx.h”來使用先行編譯結果是指編譯a.cpp的時候,如果a.cpp第一行include語句是#include “stdafx.h”的話,那麼直接取先行編譯結果檔案的結果,不再重新編譯”stdafx.h”
二、嚮導是怎麼做的?
1、設定“stdafx.cpp”的先行編譯選項是通過“stdafx.h”檔案來“產生先行編譯結果檔案”。
2、其他源檔案的先行編譯選項設定是通過“stdafx.h”來“使用先行編譯頭”
三、使用原則?
1、將相對穩定的標頭檔(比如CRT,STL,第三方固定的庫)全部寫在stdafx.h中。(是否使用stdafx.h依賴個人喜好,不過使用stdafx.h可以和嚮導保持一致)
2、全部源檔案第一行都加#include “stdafx.h”。
3、一些不能修改的源檔案(如果公用的代碼,不具備許可權修改的代碼),設定他的先行編譯選項是“不使用先行編譯頭”。注意,一定不能是選擇“自動產生先行編譯頭”,因為這樣會將stdafx.h的結果衝掉(這個不知道是BUG還是設計的問題了,.^_^。)。
四、Q&A
Q、為什麼不全部使用“自動產生先行編譯標頭檔”?
A、“自動產生先行編譯標頭檔”和什麼都不用沒有什麼兩樣,編譯速度沒有質的提高。
Q、手工添加一個新的源檔案到項目的時候,經常出現類似錯誤:
fatal error C1010: unexpected end of file while looking for precompiled header directive
A、因為嚮導預設的設定是“使用先行編譯頭”,但是你新加的檔案並沒有在第一行包含“stdafx.h”。解決的方法要麼修改成“不使用先行編譯頭”,要麼添加一行#include “stdafx.h”
Q、加stdafx.h和stdafx.cpp總覺得是和編譯平台綁定了,不