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

相关文章
相关标签/搜索