解決Visual C++ 編譯器中混合 .c 文件時(shí)收到 C1853 預(yù)編譯頭錯(cuò)誤的方法(轉(zhuǎn))
當(dāng) Visual C++ 項(xiàng)目啟用了預(yù)編譯頭 (Precompiled header) 功能時(shí),如果項(xiàng)目中同時(shí)混合有 .c 和 .cpp 源文件,則可能收到 C1853 編譯器錯(cuò)誤: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)(致命錯(cuò)誤C1853: “filename.pch”預(yù)編譯頭文件來(lái)自編譯器的早期版本,或者預(yù)編譯頭為C++ 而在C 中使用它(或相反))。
該錯(cuò)誤是因?yàn)楫?dāng)項(xiàng)目中混合了 .cpp 和 .c 文件時(shí),編譯器會(huì)對(duì)它們采取不同的編譯方式(主要是因?yàn)閷?duì)函數(shù)聲明的處理方式不同),因而不能共用一個(gè)預(yù)編譯頭文件。在 VC++ 中,默認(rèn)的預(yù)編譯頭文件是針對(duì) C++ 的 (stdafx.h 和 stdafx.cpp),當(dāng)然也可以創(chuàng)建針對(duì) C 的預(yù)編譯頭。有趣的是,在舊版的 VC++ 中,這個(gè)錯(cuò)誤的提示很具有誤導(dǎo)性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 常常讓人摸不著頭腦。應(yīng)該說(shuō),在新版中的這個(gè)提示是有所改進(jìn)的。不過(guò)在網(wǎng)上搜索一番,對(duì)這個(gè)問(wèn)題往往都是建議對(duì)整個(gè)項(xiàng)目取消預(yù)編譯頭的設(shè)置。這顯然不是一個(gè)好的解決方案。對(duì)于一個(gè)比較大的工程來(lái)說(shuō),使用預(yù)編譯頭可以使總的編譯時(shí)間大大減少。因而保留預(yù)編譯頭的設(shè)置才是比較好的解決方案。搜索 MSDN,針對(duì)不同的情況,可以有不同的解決方案:
方案1:適用于絕大多數(shù)文件是 .cpp 或絕大多數(shù)文件是.c的情況。在這種情況下,將少數(shù)的不同類(lèi)文件設(shè)為不使用預(yù)編譯頭是比較平衡的做法,方法是:對(duì)于 VC++6.0,在 FileView 里對(duì)要取消預(yù)編譯頭的 .c (或 .cpp) 文件點(diǎn)右鍵,選擇 settings,在彈出的對(duì)話(huà)框右邊選擇 category 為 precompiled headers,再設(shè)置選項(xiàng)為 not using ...;對(duì)于 VS2005,則在 solution explorer 中對(duì)相應(yīng)文件點(diǎn)右鍵選擇 properties,在 precompiled headers 項(xiàng)下設(shè)置 not using... 即可。如果需要設(shè)置多個(gè)文件,則可以按住 Ctrl 鍵再同時(shí)選中這些文件并設(shè)置
方案2:如果受影響的文件比較多,則把它們都設(shè)置禁止預(yù)編譯頭的話(huà)仍然會(huì)使項(xiàng)目總體的編譯速度大大降低,得不償失。這時(shí)考慮可以為這組文件建立專(zhuān)用的預(yù)編譯頭。在 VC++ 極早期版本(1.5及以前版本)中是支持單個(gè)工程中建立分別針對(duì) .c 和 .cpp 的預(yù)編譯頭的,但之后的版本中只支持單獨(dú)的預(yù)編譯頭。在這種情況下,我們可以在workspace(或 solution)中建立一個(gè)新的靜態(tài)鏈接庫(kù) (Static Library) 工程,將所有的 .c 文件獨(dú)立出來(lái)加入到該工程中單獨(dú)編譯,這樣就可以在該靜態(tài)鏈接庫(kù)中針對(duì) .c 文件創(chuàng)建預(yù)編譯頭。但是這樣做在一定程度上需要被獨(dú)立出來(lái)的代碼在邏輯上是屬于同一模塊中的,這樣才便于維護(hù)。不過(guò)從設(shè)計(jì)的角度來(lái)說(shuō),這個(gè)要求一般是滿(mǎn)足的,否則就應(yīng)考慮下項(xiàng)目的總體設(shè)計(jì)了:P 最后別忘了設(shè)置原項(xiàng)目的依賴(lài)項(xiàng) (dependency) 為獨(dú)立出來(lái)的這個(gè)靜態(tài)庫(kù)項(xiàng)目。
posted on 2008-09-25 16:02 大海 閱讀(626) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): VC++