vs錯誤【C1083 C1854 C4727】的若干解決辦法(對先行編譯檔案頭的解釋)

來源:互聯網
上載者:User

標籤:

      這幾天寫程式,無意間把編譯中間檔案給刪了,然後就出現了C1083編譯錯誤。

xxx.cpp

..\commen\xxx.cpp(2) : fatal error C1083: 無法開啟先行編譯標頭檔:“Release\xxx.pch”: No such file or directory

        在網上搜尋了很久,大致是這麼解決的,將【建立/使用編譯頭】改為“不使用編譯頭”,或者改成 “建立先行編譯頭(/Yc)”, 然後編譯就通過了。

         於是我也招搬了 “不使用編譯頭” ,結果出現下面的錯誤:

xxx.cpp
..\commen\xxx.cpp(2) : fatal error C1083: 無法開啟包括檔案:“stdafx.h”: No such file or directory

         原因是我的程式檔案放了好幾個目錄,公用目錄下自然沒有“stdafx.h”,所以就編譯錯誤了。然後我又改為“建立先行編譯頭”,在Debug版本下,貌似對了。Release時,忘了怎麼配置的,結果仍然提示  “無法開啟先行編譯標頭檔 xx.pch”。

        按照網上的說法,我把stdafx.cpp單獨編譯了一下(在解決方案視圖,右鍵檔案->編譯,則只對選中檔案進行編譯),然後再整體編譯串連,編譯通過了,但是連結又出問題了,提示如下:

warning C4727: 具有相同時間戳記的名為 xxx.pch 的 PCH 已存在於yyy.obj 和 yyy.obj 中。使用第一個 PCH。
MyDlg2.obj : error LNK2005: [email protected]@[email protected]@UdliphkzxvUex[email protected] 已經在 MyDlg.obj 中定義

         我暈!然後又改成 “使用先行編譯頭(/Yu)”,當編譯正要成功是,悲劇又來了:

.\MyDlg.cpp(4) : fatal error C1854: 無法覆蓋在建立對象檔案“xxx\release\mydlg.obj”的先行編譯頭過程中形成的資訊

        然後我就反覆,將【建立/使用編譯頭】,在這幾個選項中切換嘗試,但錯誤始終存在。正在我無奈之極,突然搜到了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

有關更多資訊,請參見

  • /Yc(建立先行編譯的標頭檔)

  • /Yu(使用先行編譯的標頭檔)

 

        

        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檔案仍然存在,要手動刪掉。

盡量不要使用2、3的方法,應直接使用4的方法,雖然麻煩點,但是值得的,免得後面哪裡刪錯了有出現這鬼錯誤。

 

先行編譯頭是很有用的,不要因為錯誤而認為他礙眼,也不要因為VC每個源檔案前面都要包含stdafx.h而覺得麻煩。下面是別人對這個錯誤以及對編譯頭的分析,

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

http://blog.csdn.net/you_lan_hai/article/details/6966038

vs錯誤【C1083 C1854 C4727】的若干解決辦法(對先行編譯檔案頭的解釋)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.