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

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

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

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

    sqlserver 附加数据库失败,错误提示:5拒绝访问 解决办法 金刚 sqlserver 附加数据库 拒绝访问 今天把项目拷贝到新硬盘里,发现在附加数据库中提示:操作系统错误5:"5拒绝 ...

  2. MarkdownPad 2 在win10下出错:HTML 渲染错误(This view has crashed) 的解决办法 + MarkdownPad2.5 注册码

    首先附上MarkdownPad2.5的注册码. 邮箱:Soar360@live.com 授权密钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImD ...

  3. Python pexpect出现错误‘module have no attribute "spawn" 解决办法

    今天我遇到了这个错误,现在将错误总结如下: 1.首先查询一下自己的操作系统,pexpect中的spawn()和run()仅仅运行在POSIX系统上,在WINDOWS下是没有这两个东西的,在官网http ...

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

     使用Maven+SpringMVC+Eclipse软件安装配置过程中的问题: 1.Eclipse总是卡死的解决办法: 一:内存不足所以会卡死,配置一下eclipse.ini修改这几个值就好了-X ...

  5. 启动fiddler情况下,网络连接错误[Fiddler] The connection to ** failed.解决办法

    这种错误是由于浏览器设置了代理,而代理服务器配置不正确导致 解决办法 1.关闭浏览器服务器代理,设置-高级-网络代理 2.检查网络代理设置是否正确,Fiddler中配置的端口号需要跟浏览器中配置的端口 ...

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

    [debug] [iOS] App is not installed. Will try to install. [MJSONWP] Encountered internal error runnin ...

  7. 使用sourceTree向码云提交代码时 push 错误 (或认证失败)解决办法

     如果出现push不进去或者使用命令push认证失败时,很可能是你密码有误或者用户冲突,解决办法如下: 1.进入目录,找到文件后先备份一下 注意:appData可能隐藏了,若是隐藏,先让其显示  2. ...

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

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core 通知 未知 处理程序 尚未 ...

  9. mysql错误提示不是英语的解决办法

    mysql提示突然就变成法语了,google了一下,找到了解决方法:打开my.ini文件,找到[mysqld]配置项如下 [mysqld] port explicit_defaults_for_tim ...

随机推荐

  1. BZOJ 1564: [NOI2009]二叉查找树( dp )

    树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...

  2. linux中断--进程上下文和中断上下文

    一.前言 中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断.这个处理过程中的上下文就是中断上下文. 为什么可能导致睡眠的函数都不能在中断上下文中使用呢? 首先睡眠的含义 ...

  3. 容易上手-类似ERP系统 简单特效

    今天大概简单写一个效果, 这个效果 很容易 上手的: html: <style type="text/css">.menu_list ul{display:none;} ...

  4. linux 生产环境搭建

    Linux基础命令杂记   今天又一次搞Linux生产环境搭建.这是种步骤很多,很繁琐而且又不得不做的事情.虽然做过很多次,但还是有很多步骤.命令不记得,每一次到处找资料很麻烦,于是将一些步骤记下,以 ...

  5. PHP不显示报错了怎么办~

    php.ini里设置吧, 找到 display_errors, 设置成on, error_reporting = E_ALL

  6. struts2笔记10-值栈

    1.问题 提交页面: <h4>注册产品</h4> <form action="save.do" method="post"> ...

  7. python---__getattr__\__setattr_重载'.'操作

    #!coding:utf-8 class Person(object): def __init__(self,id): #定义一个名为ID的属性 self.ID=id def __getattr__( ...

  8. Cidr计算

    项目上有个需求,要求计算cidr,网上perl和php,python很多,java的很少,呵呵,虽说懂点那个,毕竟还是会这个. 所以查了一下: https://foo.cs.ucsb.edu/cs56 ...

  9. 以前用Delphi写的CSDN免积分下载器

    用了AlphaControl皮肤组件,原理很简单,就是CSDN的一个漏洞.我主要是使用WinInet来获取相关信息,然后从里面分析出真实的下载URL,同时我也是用了AES加密.function Get ...

  10. css笔记:如何让一个div居于页面正中间

    如何让一个div居于页面中间,我今天说的是让一个div水平居中同时垂直居中,而不是简单的top:50%,left:50%.当然,我们就按一开始的思路写一下:top,left属性都设为50%,看一下效果 ...