您對(duì)同一文件指定 /Yc(創(chuàng)建預(yù)編譯頭文件)選項(xiàng)后指定了 /Yu(使用預(yù)編譯頭文件)選項(xiàng)。 某些聲明(如包括__declspecdllexport 的聲明)使此操作無(wú)效。
| 這幾天寫(xiě)程序,無(wú)意間把編譯中間文件給刪了,然后就出現(xiàn)了C1083編譯錯(cuò)誤。xxx.cpp ..\commen\xxx.cpp(2) : fatal error C1083: 無(wú)法打開(kāi)預(yù)編譯頭文件:“Release\xxx.pch”: No such file or directory 在網(wǎng)上搜索了很久,大致是這么解決的,將【創(chuàng)建/使用編譯頭】改為“不使用編譯頭”,或者改成 “創(chuàng)建預(yù)編譯頭(/Yc)”, 然后編譯就通過(guò)了。 
 于是我也招搬了 “不使用編譯頭” ,結(jié)果出現(xiàn)下面的錯(cuò)誤: xxx.cpp 原因是我的程序文件放了好幾個(gè)目錄,公共目錄下自然沒(méi)有“stdafx.h”,所以就編譯錯(cuò)誤了。然后我又改為“創(chuàng)建預(yù)編譯頭”,在Debug版本下,貌似對(duì)了。Release時(shí),忘了怎么配置的,結(jié)果仍然提示 “無(wú)法打開(kāi)預(yù)編譯頭文件 xx.pch”。 按照網(wǎng)上的說(shuō)法,我把stdafx.cpp單獨(dú)編譯了一下(在解決方案視圖,右鍵文件->編譯,則只對(duì)選中文件進(jìn)行編譯),然后再整體編譯連接,編譯通過(guò)了,但是鏈接又出問(wèn)題了,提示如下: warning C4727: 具有相同時(shí)間戳的名為 xxx.pch 的 PCH 已存在于yyy.obj 和 yyy.obj 中。使用第一個(gè) PCH。 我暈!然后又改成 “使用預(yù)編譯頭(/Yu)”,當(dāng)編譯正要成功是,悲劇又來(lái)了: .\MyDlg.cpp(4) : fatal error C1854: 無(wú)法覆蓋在創(chuàng)建對(duì)象文件“xxx\release\mydlg.obj”的預(yù)編譯頭過(guò)程中形成的信息 然后我就反復(fù),將【創(chuàng)建/使用編譯頭】,在這幾個(gè)選項(xiàng)中切換嘗試,但錯(cuò)誤始終存在。正在我無(wú)奈之極,突然搜到了MSDN中對(duì)錯(cuò)誤C4727和C1854的解釋: 
 http://msdn.microsoft.com/zh-cn/library/5a193hd8.aspx 
 錯(cuò)誤 C1854Visual Studio 2010 無(wú)法覆蓋在創(chuàng)建對(duì)象文件“filename”的預(yù)編譯頭過(guò)程中形成的信息
 您對(duì)同一文件指定 /Yc(創(chuàng)建預(yù)編譯頭文件)選項(xiàng)后指定了 /Yu(使用預(yù)編譯頭文件)選項(xiàng)。 某些聲明(如包括__declspecdllexport 的聲明)使此操作無(wú)效。 
 http://msdn.microsoft.com/zh-cn/library/ms235540.aspx 
 編譯器警告(等級(jí) 1)C4727Visual Studio 2010 在 obj_file_1 和 obj_file_2 中找到具有相同時(shí)間戳的名為 pch_file 的 PCH。使用第一個(gè)
 PCH。
 如果用 /Yc 編譯多個(gè) compiland,并且其中的編譯器能夠用相同的 .pch 時(shí)間戳標(biāo)記所有的 .obj 文件,將發(fā)生 C4727。 要消除此警告,請(qǐng)用 /Yc /c 編譯一個(gè)源文件(創(chuàng)建 pch),并用 /Yu /c 分別編譯其他的源文件(使用 pch),然后再將它們鏈接到一起。 因此,如果使用了下面的選項(xiàng)就會(huì)生成 C4727: cl /clr /GL a.cpp b.cpp c.cpp /Ycstdafx.h 您可改用下面的選項(xiàng): cl /clr /GL a.cpp /Ycstdafx.h /c cl /clr /GL b.cpp c.cpp /Yustdafx.h /link a.obj 有關(guān)更多信息,請(qǐng)參見(jiàn) 
 MSDN對(duì)C4727是這樣解決的: 
 您可改用下面的選項(xiàng): cl /clr /GL a.cpp /Ycstdafx.h /c cl /clr /GL b.cpp c.cpp /Yustdafx.h /link a.obj 原本以為要手動(dòng)使用命令含編譯所有文件,我想還是算了,因?yàn)槲业墓こ逃?0多個(gè)文件,除非寫(xiě)成bat,否則編譯還會(huì)累死。幸好我不會(huì)bat,沒(méi)有動(dòng)手去寫(xiě)。我猜想VS功能這么強(qiáng)大,既然報(bào)錯(cuò)了,錯(cuò)誤應(yīng)該有解決辦法的,不可能讓我們手動(dòng)去編譯。在查看工程屬性的時(shí)候,無(wú)意間,點(diǎn)到了stdafx.cpp,豁然開(kāi)朗! 
 然后按照MSDN的那個(gè)解覺(jué)辦法的原理,進(jìn)行設(shè)置,就OK了。對(duì)工具和問(wèn)題原理不熟,害我走這么多的彎路啊。 
 總結(jié)下,大致四種解決的辦法: 1. 如果無(wú)意間,刪掉xxx.pch文件,如果編譯器報(bào)錯(cuò) “C1083無(wú)法打開(kāi)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文件仍然存在,要手動(dòng)刪掉。 盡量不要使用2、3的方法,應(yīng)直接使用4的方法,雖然麻煩點(diǎn),但是值得的,免得后面哪里刪錯(cuò)了有出現(xiàn)這鬼錯(cuò)誤。 
 預(yù)編譯頭是很有用的,不要因?yàn)殄e(cuò)誤而認(rèn)為他礙眼,也不要因?yàn)閂C每個(gè)源文件前面都要包含stdafx.h而覺(jué)得麻煩。下面是別人對(duì)這個(gè)錯(cuò)誤以及對(duì)編譯頭的分析, http://hi.baidu.com/andywangcn/blog/item/7d8da5072516fc7003088172.html | 
|  |