之前有人在win7上遇到了类似的错误,Error      1     fatal error C1859: 'Debug\CppDllExport.pch' unexpected precompiled header error, simply rerunning the compiler might fix this problem f:\document\visual studio 2008\codefx\visual studio 2008\cppdllexport\cppdllexport.cpp   18    CppDllExport

这个错误一般出现在以下条件:

Visual C++ 编译器是在win7上被调用的;

预编译头(PCH) 被启用(enable)了;

/analyze 被启用了, 这不是一个必须的条件, 但是增加了遇到问题的重现几率)

尽管错误提示建议道: 简单的重新编译吧, 但是这个情况可能好转不了. 事实上, 这个”简单”的错误起因是预编译头和win7的增强安全技术.

Visual c++ 预编译头和ASLR

预编译的头文件存储着编译在某时刻的”状态”, 这个状态的信息可以被之后的编译器重用. 之前的15年, 编译器都是把预编译头以文件放着, 再从虚拟内存里读取, 这样有99.999%的可靠并且效率也挺好的. 不过这玩意也是架构上的一个痛点.

因为PCH文件本身包含着内部指针, 它在被重新载入的时候, 必须是写入虚拟内存的时候那个相同的地址. 所以如果PCH被之后的编译器加载的时候指针会变得不一样或错误. 复杂点说, PCH 还包括多态对象和每个多态对象自包含的虚方法表指针(virtual function table pointer –VFTP), 这个表指针, 指向了模块中的虚方法. 这样子, 当PCH中的多态对象依赖于某个特殊模块的指针表时候, 模块必须以创建PCH文件时候指针值载入. 如果模块以不同地址加载的话, PCH中的VFTP 指针 就不对了.

说了这么长, 简单说就是, 无论是PCH还是模块, 都不能在编译器变动. Visual C++编译器将在启动前检这2个条件, 要不然立刻就报这个错. 说一下地址空间布局随机化(Address Space Layout Randomization (ASLR).的一点算法, ASLR可以通过随机进程的模块, 来减少一些恶意攻击模块的影响. 在VISTA的时候, VS2008通过 /dynamicbase:no 在编译前来绕过了这个东西, 当然, 在win7上这个情况变糟了点.

所以一开始的想法是通过把编译模块地址放到一个”安全”的地方,(还是绕过ASLR, 比如减少模块的重调用次数), 糟糕的是失败了, 模块地址还是会移动。 因为一些让人郁闷的因素,如NativeDLL loader,进程创建顺序,devenv.exe条用cl.exe等等, 错误很难调试, 就像蝴蝶效应, 牵一发而动全身。

解决方案

这个修复将于VS2010和vs2008的补丁包里中出现, 你现在则可以这样弄:

l 禁用 /analyze (C++ => advanced => enable code analysis for C++)

l 清除项目。 (之前的预编译头都删了)

l 重启机器

l 禁用PCH文件 (C++ => Precompiled headers => create/use pre-compiled headers)

多谢

Mark Roberts

Visual C++ Compiler Team

来源在这里

http://blogs.msdn.com/vcblog/archive/2009/11/12/visual-c-precompiled-header-errors-on-windows-7.aspx

Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler migh相关推荐

  1. 创建预编译头 Debug 正常 Release Link Error:预编译头已存在,使用第一个 PCH

    创建预编译头 Debug 正常 Release Link Error Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqU ...

  2. 解决Visual C++ 编译器中混合 .c 文件时收到 C1853 预编译头错误的方法

    问题:用VC++编译器混合编译.c文件时,收到fatal error C1853:....预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反). 原因:当 Visua ...

  3. VC 工程中包含 .c 或cpp文件编译时产生的.pch预编译头错误(C1853)

    编写混合  时出现这样错误"fatal error C1853: "Debug\SMS_Test.pch"预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 ...

  4. 解决fatal error C1859: “Debug\thread5.pch”意外的预编译头错误的方法

    VS2008中使用C++工程向导建立项目,直接编译时出现该错误.有两个方法来解决该问题: (1)clean项目,重新生成项目 (2)删除该项目对应文件夹下的debug文件中所有文件,重新执行(1) 如 ...

  5. “fatal error C1859: “Release\XXXX.pch”意外的预编译头错误,只需重新运行编译器就可能修复此问题”的一个解决办法

    今天又突然出现这种错误,网上的方法都搞不定. 实在无法,找到pch文件所在文件夹,一整个文件夹都删除了,然后尝试了下编译,竟然可以编译了!!! 具体什么原理不清楚,被这种情况逼到想哭的小伙伴们可以尝试 ...

  6. fatal error C1859: 意外的预编译头错误,只需重新运行编译器就可能修复此问题

    查看项目的输出目录,删除整个目录后重新生成(pch文件所在目录,一般release目录),如果单级目录删除后仍然报该错误,删除多级目录(如x64/release),重新运行编译器.

  7. error:在查找预编译头时遇到意外的文件结尾

    我遇到的错误是是否忘记向源文件添加"#include "pch.h"",参考下面这篇博客已解决 转载自 https://blog.csdn.net/ghevin ...

  8. error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”

    fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h (2011-09-08 22:17:50) 错 ...

  9. 预编译文件,预编译头文件认识

    一.概念: 1.预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个"预编译头文件"的时候,则自动从这个编译 ...

最新文章

  1. android按下enter键如何让光标跳到下一个edittext,我们如何知道光标已经移动到edittext的下一行android...
  2. cuda gpu相关汇总
  3. vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...
  4. loadrunner之socket协议脚本编写
  5. java short uuid_MySQL-使用UUID_SHORT( ) 的问题
  6. swift 拖动按钮_ios – Swift中可拖动的UIButton / Elements?
  7. 如何在论坛里提高自己的从业水平
  8. php开发环境浏览器有哪些,ie内核浏览器有哪些
  9. 【转】中华吸血鬼分析
  10. 量子笔记:酉矩阵(幺正矩阵)、量子门的可逆性
  11. idea切换Git分支时弹出Git Checkout problem
  12. 数据结构 与游戏背包的设计
  13. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟
  14. SCI、EI、ISTP国际三大检索分别指的是什么?
  15. keyshot怎么贴logo_KeyShot图文教程,三步教你如何使用添加有织纹的Logo
  16. webstorm 2018 激活破解方法亲测可用
  17. 慧择业务布局成效明显,戴维斯双击可期
  18. r语言实现sem_利用R语言做结构方程模型分析
  19. 百度地图定位API,精度提高
  20. 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.要递归方程,请编程实现在第n年的时候,共有多少头母牛?

热门文章

  1. 计算机网络(一)带宽
  2. 权限提升:不带引号服务路径 || 不安全的服务权限.
  3. 2021.1.4CHM文档制作(手动制作+软件制作+原理讲解)
  4. 问题一百二十九:阿基米德特性
  5. Iterative Soft Thresholding和Iterative Shrinkage/Thresholding的区别
  6. 快手直播间数据采集截流软件脚本,实时采集引流精准获取客源【采集脚本+引流技术教程】
  7. Elasticsearch之聚合分析
  8. springboot拦截请求路径_SpringBoot拦截器如何获取http请求参数
  9. 计算机中的英语六级作文万能模板,大学英语六级作文万能模板「议论文」
  10. Python Tkinter 小项目 RGB数值转换为16进制码