vs错误【C1083C1854C4727】的若干解决办法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Visual Studio 2010 Visual Studio 2010vs错误【C1083C1854C4727】的若⼲解决办法
这⼏天写程序,⽆意间把编译中间⽂件给删了,然后就出现了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:
___@@_PchSym_@00@UdliphkzxvUexUszmarUKltKoyKrqKluKpmKqsKltKroKonKluKqoKoleBUivovzhvUnbwotOlyq@ 已经在MyDlg.obj 中定义
我晕!然后⼜改成 “使⽤预编译头(/Yu)”,当编译正要成功是,悲剧⼜来了:
.\MyDlg.cpp(4) : fatal error C1854: ⽆法覆盖在创建对象⽂件“xxx\release\mydlg.obj”的预编译头过程中形成的信息然后我就反复,将【创建/使⽤编译头】,在这⼏个选项中切换尝试,但错误始终存在。

正在我⽆奈之极,突然搜到了MSDN中对错误C4727和C1854的解释:
错误 C1854
⽆法覆盖在创建对象⽂件“filename”的预编译头过程中形成的信息
您对同⼀⽂件指定 /Yc(创建预编译头⽂件)选项后指定了 /Yu(使⽤预编译头⽂件)选项。

某些声明(如包括__declspecdllexport 的声明)使此操作⽆效。

编译器警告(等级 1)C4727
在 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 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⽽觉得⿇烦。

下⾯是别⼈对这个错误以及对编译头的分析,。

相关文档
最新文档