小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 昵稱8245320 2011-12-19

        這幾天寫程序,無意間把編譯中間文件給刪了,然后就出現(xiàn)了C1083編譯錯誤。

xxx.cpp

..\commen\xxx.cpp(2) : fatal error C1083: 無法打開預(yù)編譯頭文件:“Release\xxx.pch”: No such file or directory

        在網(wǎng)上搜索了很久,大致是這么解決的,將【創(chuàng)建/使用編譯頭】改為“不使用編譯頭”,或者改成 “創(chuàng)建預(yù)編譯頭(/Yc)”, 然后編譯就通過了。


         于是我也招搬了 “不使用編譯頭” ,結(jié)果出現(xiàn)下面的錯誤:

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

         原因是我的程序文件放了好幾個目錄,公共目錄下自然沒有“stdafx.h”,所以就編譯錯誤了。然后我又改為“創(chuàng)建預(yù)編譯頭”,在Debug版本下,貌似對了。Release時,忘了怎么配置的,結(jié)果仍然提示  “無法打開預(yù)編譯頭文件 xx.pch”。

        按照網(wǎng)上的說法,我把stdafx.cpp單獨編譯了一下(在解決方案視圖,右鍵文件->編譯,則只對選中文件進(jìn)行編譯),然后再整體編譯連接,編譯通過了,但是鏈接又出問題了,提示如下:

warning C4727: 具有相同時間戳的名為 xxx.pch 的 PCH 已存在于yyy.obj 和 yyy.obj 中。使用第一個 PCH。
MyDlg2.obj : error LNK2005: ___@@_PchSym_@00@UdliphkzxvUexUszmarUKltKoyKrqKluKpmKqsKltKroKonKluKqoKoleBUivovzhvUnbwotOlyq@ 已經(jīng)在 MyDlg.obj 中定義

         我暈!然后又改成 “使用預(yù)編譯頭(/Yu)”,當(dāng)編譯正要成功是,悲劇又來了:

.\MyDlg.cpp(4) : fatal error C1854: 無法覆蓋在創(chuàng)建對象文件“xxx\release\mydlg.obj”的預(yù)編譯頭過程中形成的信息

        然后我就反復(fù),將【創(chuàng)建/使用編譯頭】,在這幾個選項中切換嘗試,但錯誤始終存在。正在我無奈之極,突然搜到了MSDN中對錯誤C4727和C1854的解釋:


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

錯誤 C1854

Visual Studio 2010
無法覆蓋在創(chuàng)建對象文件“filename”的預(yù)編譯頭過程中形成的信息

您對同一文件指定 /Yc(創(chuàng)建預(yù)編譯頭文件)選項后指定了 /Yu(使用預(yù)編譯頭文件)選項。 某些聲明(如包括__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 時間戳標(biāo)記所有的 .obj 文件,將發(fā)生 C4727。

要消除此警告,請用 /Yc /c 編譯一個源文件(創(chuàng)建 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

有關(guān)更多信息,請參見

        

        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功能這么強大,既然報錯了,錯誤應(yīng)該有解決辦法的,不可能讓我們手動去編譯。在查看工程屬性的時候,無意間,點到了stdafx.cpp,豁然開朗!


然后按照MSDN的那個解覺辦法的原理,進(jìn)行設(shè)置,就OK了。對工具和問題原理不熟,害我走這么多的彎路啊。


總結(jié)下,大致四種解決的辦法:

1. 如果無意間,刪掉xxx.pch文件,如果編譯器報錯 “C1083無法打開xxx.pch”,一般只需要清理解決方案,然后rebuild all就可以了。

2.如果1不管用,將【創(chuàng)建/使用預(yù)編譯頭】改為 “不使用編譯頭”,然后清理解決方案,rebuild即可。

3.如果仍然不管用,將【創(chuàng)建/使用預(yù)編譯頭】改為 “創(chuàng)建預(yù)編譯頭”,然后清理解決方案,rebuild即可。

4.如果上述方法,還不管用。將【創(chuàng)建/使用預(yù)編譯頭】改回 “使用預(yù)編譯頭”,然后將“stdafx.cpp”的屬性中【創(chuàng)建/使用預(yù)編譯頭】,改成 "創(chuàng)建預(yù)編譯頭",將其他所有的.cpp文件的預(yù)編譯屬性均該為 “使用預(yù)編譯頭” ,清理解決方案,然后rebuild即可。

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

盡量不要使用2、3的方法,應(yīng)直接使用4的方法,雖然麻煩點,但是值得的,免得后面哪里刪錯了有出現(xiàn)這鬼錯誤。


預(yù)編譯頭是很有用的,不要因為錯誤而認(rèn)為他礙眼,也不要因為VC每個源文件前面都要包含stdafx.h而覺得麻煩。下面是別人對這個錯誤以及對編譯頭的分析,

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多