vs錯誤【C1083 C1854 C4727】的若干解決辦法

這幾天寫程序,無心間把編譯中間文件給刪了,而後就出現了C1083編譯錯誤。xxx.cpp
html

..\commen\xxx.cpp(2) : fatal error C1083: 沒法打開預編譯頭文件:「Release\xxx.pch」: No such file or directoryide

        在網上搜索了好久,大體是這麼解決的,將【建立/使用編譯頭】改成「不使用編譯頭」,或者改爲 「建立預編譯頭(/Yc)」, 而後編譯就經過了。工具


         因而我也招搬了 「不使用編譯頭」 ,結果出現下面的錯誤:ui

xxx.cpp
..\commen\xxx.cpp(2) : fatal error C1083: 沒法打開包括文件:「stdafx.h」: No such file or directory

spa

         緣由是個人程序文件放了好幾個目錄,公共目錄下天然沒有「stdafx.h」,因此就編譯錯誤了。而後我又改成「建立預編譯頭」,在Debug版本下,貌似對了。Release時,忘了怎麼配置的,結果仍然提示  「沒法打開預編譯頭文件 xx.pch」。3d

        按照網上的說法,我把stdafx.cpp單獨編譯了一下(在解決方案視圖,右鍵文件->編譯,則只對選中文件進行編譯),而後再總體編譯鏈接,編譯經過了,可是連接又出問題了,提示以下:orm

warning C4727: 具備相同時間戳的名爲 xxx.pch 的 PCH 已存在於yyy.obj 和 yyy.obj 中。使用第一個 PCH。
MyDlg2.obj : error LNK2005: ___@@_PchSym_@00@UdliphkzxvUexUszmarUKltKoyKrqKluKpmKqsKltKroKonKluKqoKoleBUivovzhvUnbwotOlyq@ 已經在 MyDlg.obj 中定義

htm

         我暈!而後又改爲 「使用預編譯頭(/Yu)」,當編譯正要成功是,悲劇又來了:對象

.\MyDlg.cpp(4) : fatal error C1854: 沒法覆蓋在建立對象文件「xxx\release\mydlg.obj」的預編譯頭過程當中造成的信息
blog

        而後我就反覆,將【建立/使用編譯頭】,在這幾個選項中切換嘗試,但錯誤始終存在。正在我無奈之極,忽然搜到了MSDN中對錯誤C4727和C1854的解釋:


http://msdn.microsoft.com/zh-cn/library/5a193hd8.aspx

錯誤 C1854

Visual Studio 2010

其餘版本

沒法覆蓋在建立對象文件「filename」的預編譯頭過程當中造成的信息

 

您對同一文件指定 /Yc(建立預編譯頭文件)選項後指定了 /Yu(使用預編譯頭文件)選項。 某些聲明(如包括__declspecdllexport 的聲明)使此操做無效。

 


http://msdn.microsoft.com/zh-cn/library/ms235540.aspx

編譯器警告(等級 1)C4727

Visual Studio 2010

其餘版本

在 obj_file_1 和 obj_file_2 中找到具備相同時間戳的名爲 pch_file 的 PCH。使用第一個 PCH。

 

若是用 /Yc 編譯多個 compiland,而且其中的編譯器可以用相同的 .pch 時間戳標記全部的 .obj 文件,將發生 C4727。

要消除此警告,請用 /Yc /c 編譯一個源文件(建立 pch),並用 /Yu /c 分別編譯其餘的源文件(使用 pch),而後再將它們連接到一塊兒。

所以,若是使用了下面的選項就會生成 C4727:

cl /clr /GL a.cpp b.cpp c.cpp /Ycstdafx.h

您可改用下面的選項:

cl /clr /GL a.cpp /Ycstdafx.h /c

cl /clr /GL b.cpp c.cpp /Yustdafx.h /link a.obj

有關更多信息,請參見

 

        

        MSDN對C4727是這樣解決的:

您可改用下面的選項:

cl /clr /GL a.cpp /Ycstdafx.h /c

cl /clr /GL b.cpp c.cpp /Yustdafx.h /link a.obj

        本來覺得要手動使用命令含編譯全部文件,我想仍是算了,由於個人工程有30多個文件,除非寫成bat,不然編譯還會累死。幸虧我不會bat,沒有動手去寫。我猜測VS功能這麼強大,既然報錯了,錯誤應該有解決辦法的,不可能讓咱們手動去編譯。在查看工程屬性的時候,無心間,點到了stdafx.cpp,豁然開朗!


而後按照MSDN的那個解覺辦法的原理,進行設置,就OK了。對工具和問題原理不熟,害我走這麼多的彎路啊。


總結下,大體四種解決的辦法:

1. 若是無心間,刪掉xxx.pch文件,若是編譯器報錯 「C1083沒法打開xxx.pch」,通常只須要清理解決方案,而後rebuild all就能夠了。

2.若是1無論用,將【建立/使用預編譯頭】改成 「不使用編譯頭」,而後清理解決方案,rebuild便可。

3.若是仍然無論用,將【建立/使用預編譯頭】改成 「建立預編譯頭」,而後清理解決方案,rebuild便可。

4.若是上述方法,還無論用。將【建立/使用預編譯頭】改回 「使用預編譯頭」,而後將「stdafx.cpp」的屬性中【建立/使用預編譯頭】,改爲 "建立預編譯頭",將其餘全部的.cpp文件的預編譯屬性均該爲 「使用預編譯頭」 ,清理解決方案,而後rebuild便可。

注意:每次更改屬性後,都要清理解決方案,若是工程目錄下的.pch文件仍然存在,要手動刪掉。

儘可能不要使用二、3的方法,應直接使用4的方法,雖然麻煩點,可是值得的,省得後面哪裏刪錯了有出現這鬼錯誤。


預編譯頭是頗有用的,不要由於錯誤而認爲他礙眼,也不要由於VC每一個源文件前面都要包含stdafx.h而以爲麻煩。下面是別人對這個錯誤以及對編譯頭的分析,

http://hi.baidu.com/andywangcn/blog/item/7d8da5072516fc7003088172.html

相關文章
相關標籤/搜索