預編譯頭文件來自編譯器的早期版本,或者預編譯頭爲 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,針對不一樣的狀況,能夠有不一樣的解決方案:this

本人是用方法已解決的spa

方案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 Library) 工程,將全部的 .c 文件獨立出來加入到該工程中單獨編譯,這樣就能夠在該靜態連接庫中針對 .c 文件建立預編譯頭。可是這樣作在必定程度上須要被獨立出來的代碼在邏輯上是屬於同一模塊中的,這樣才便於維護。不過從設計的角度來講,這個要求通常是知足的,不然就應考慮下項目的整體設計了:P 最後別忘了設置原項目的依賴項 (dependency) 爲獨立出來的這個靜態庫項目。編譯器

相關文章
相關標籤/搜索