vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)

这几天写程序,无意间把编译中间文件给删了,然后就出现了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

有关更多信息,请参见

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

时间: 2024-10-03 22:16:12

vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)的相关文章

Google不可用的若干解决办法

对于习惯于使用Chrome以及Google搜索,Gmail,Google Scholar,code google等相关业务的用户而言,Google不可用实在是太难过了,本人依据个人使用过的方案,以及网络参看的某些方案,这里提出若干建议,仅供参考,依个人喜好可选择策略. 修改hosts文件         要知道在中国大陆访问很多网站都是受限的,一个解决办法是通过修改hosts文件就可以访问某些网站,可以一定程度缓解这一问题,但这样的修改并不总是有效,可能需要随时更新,这一方法本人在很久以前试过,

sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法

sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法 金刚 sqlserver 附加数据库 拒绝访问 今天把项目拷贝到新硬盘里,发现在附加数据库中提示:操作系统错误5:"5拒绝访问",一看提示就是权限问题. 我把数据库文件的所属文件夹的权限设置了下.文件夹的权限 Authenticated Users用户组权限设置成完全控制 Authenticated Users用户组权限.jpg 还要设置Users用户组权限,设置成完全控制

chrome提示错误:CAUTION:Provisional headers are shown 解决办法

最近作微信的开发因为前台和后台不再一个地方办公,前台也不会写php和ajax所以就造成了一种我些后台服务,她写前台调用的模式,让她的ajax直接访问我的服务端口,我提供给她数据,类似于写接口一样,于是问题出来了.前台ajax访问请求总是执行error.事例代码如下 前台测试代码index.html: <!DOCOMENT html> <html> <head> <title>测试</title> <script type="tex

1.Maven+SpringMVC+Eclipse软件安装配置,Maven报插件错误,Eclipse总是卡死的解决办法,导入一个maven工程后 一直显示importing maven project

 使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-XX:MaxPermSize=768m-Xms1024m-Xmx3072m搜索 二:修改window->preferences --- > JAVA->Edittor->Hovers,将右侧所有复选框清空. 2.因为eclipse上一次未正常关闭,导致启动卡死,错误日志为: [plain

ubuntu终端中执行命名出现错误,提示没有公钥的解决办法

在安装systemback时提示错误: 由于没有公钥,无法验证下列签名: NO_PUBKEY 14E4942973C62A1B 解决办法: 打开终端,去下载公钥: sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 14E4942973C62A1B 后面的14E4942973C62A1B 替换成自己提示缺失的公钥. 再继续执行即可. 原文地址:https://www.cnblogs.com/jsdy/p/12343245.h

Android两种常见错误(ANR和FC)解决办法

ANR(Activity Not Respone)(无响应) 先介绍下Main线程(也称为UI线程.主线程) 功能: 1.创建UI控件 2.更新UI控件状态 3.事件处理 限制:Main线程不建议有超过5秒的事件 出现条件: 当用户输入事件5s内没有得到响应,将弹出ANR对话框 广播接收者的onReceive()执行时间超过10s 解决方案(原则): 所有可能的耗时操作都要在子线程()中执行 常见耗时操作: I/O:网络操作 SDcard 数据运算 FC(Force close) 原因: 1.E

mac上运行appium提示错误Encountered internal error running command 解决办法

[debug] [iOS] App is not installed. Will try to install. [MJSONWP] Encountered internal error running command: Error: Installing /var/folders/hb/5xtrkgp16bj3rctx9kxg64t00000gn/T/2016913-9705- 1ugvtlc/Payload/Input.app failed at /Applications/Appium.a

HTTP 错误 500.XX - Internal Server Error 解决办法

HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core 通知 未知 处理程序 尚未确定 错误代码 0x800700b7 配置错误 定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节 配置文件 \\?\ 这个问题原因在于window7的IIS默认用的是ASP.NET v4.0应用程序池. 解决方法:把这个网站

android导入其他工程源码包后出现大量错误提示remove @Override annotation 的解决办法

问题描述: GitHub 下载源码后将其com包内容导入自己android项目中,大量出现错误修改提示 remove @Override annotation 问题解法: 1. 2. 3. 将Compiler compliance level:设置在1.6及以上即可