(转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre
預編譯頭文件來自編譯器的早期版本,或者預編譯頭為C++而在C中使用它(或相反)
? ? ? ?當Visual C++項目啟用了預編譯頭(Precompiled header)功能時,如果項目中同時混合有.c和.cpp源文件,則可能收到C1853編譯器錯誤:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C(or vice versa)(致命錯誤C1853: "filename.pch"預編譯頭文件來自編譯器的早期版本,或者預編譯頭為C++而在C中使用它(或相反))。
? ? ? 該錯誤是因為當項目中混合了.cpp和.c文件時,編譯器會對它們采取不同的編譯方式(主要是因為對函數聲明的處理方式不同),因而不能共用一個預編譯頭文件。在VC++中,默認的預編譯頭文件是針對C++的(stdafx.h和stdafx.cpp),當然也可以創建針對C的預編譯頭。有趣的是,在舊版的VC++中,這個錯誤的提示很具有誤導性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler.常常讓人摸不著頭腦。應該說,在新版中的這個提示是有所改進的,不過在網上搜索一番,對這個問題往往都是建議對整個項目取消預編譯頭的設置。這顯然不是一個好的解決方案。對于一個比較大的工程來說,使用預編譯頭可以使總的編譯時間大大減少。因而保留預編譯頭的設置才是比較好的解決方案。搜索MSDN,針對不同的情況,可以有不同的解決方案:
? ? ? 方案1:適用于絕大多數文件是.cpp或絕大多數文件是.c的情況。在這種情況下,將少數的不同類文件設為不使用預編譯頭是比較平衡的做法,方法是:對于VC++6.0,在FileView里對要取消預編譯頭的.c(或.cpp)文件點右鍵,選擇settings,在彈出的對話框右邊選擇category為precompiled headers,再設置選項位not using ...;(對于VS2005,則在solution explorer中對相應文件點右鍵選擇properties,在precompiled headers項下設置not using ...即可。如果需要設置多個文件,則可以按住Ctrl鍵再同時選中這些文件并設置) PS:解釋如下點擊項目 點擊屬性 然后選擇C/C++ 預編譯頭 創建使用頭文件 不使用預編譯頭文件
? ? ? 方案2:影響的文件比較多,則把它們都設置禁止預編譯頭的話仍然會使項目總體的編譯速度大大降低,得不償失。這是考慮可以為這組文件建立專用的預編譯頭。在VC++極早期版本(1.5及以前版本)中是支持單個工程中建立分別針對.c和.cpp的預編譯頭的,但之后的版本中只支持單獨的預編譯頭。在這種情況下,我們可以在workspace(或solution)中建立一個新的靜態鏈接庫(Static Librard)工程,將所有的.c文件獨立出來加入到該工程中單獨編譯,這樣就可以在該靜態鏈接庫中針對.c文件創建預編譯頭。但是這樣做在一定程度上需要被獨立出來的代碼在邏輯上是屬于同一模塊中的,這樣才便于維護。不過從設計的角度來說,這個要求一般是滿足的,否則就應考慮下項目的總體設計了。最后別忘了設置原項目的依賴項(dependency)為獨立出來的這個靜態庫項目。
? ? ? 轉載自:https://blog.csdn.net/changbaolong/article/details/17607633
總結
以上是生活随笔為你收集整理的(转)fatal error C1853: precompiled header file is from a previous version of the compiler, or the pre的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP协议中的Content-Enco
- 下一篇: cmake的使用 cmake不是内部或外