Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler migh
之前有人在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相关推荐
- 创建预编译头 Debug 正常 Release Link Error:预编译头已存在,使用第一个 PCH
创建预编译头 Debug 正常 Release Link Error Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqU ...
- 解决Visual C++ 编译器中混合 .c 文件时收到 C1853 预编译头错误的方法
问题:用VC++编译器混合编译.c文件时,收到fatal error C1853:....预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反). 原因:当 Visua ...
- VC 工程中包含 .c 或cpp文件编译时产生的.pch预编译头错误(C1853)
编写混合 时出现这样错误"fatal error C1853: "Debug\SMS_Test.pch"预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 ...
- 解决fatal error C1859: “Debug\thread5.pch”意外的预编译头错误的方法
VS2008中使用C++工程向导建立项目,直接编译时出现该错误.有两个方法来解决该问题: (1)clean项目,重新生成项目 (2)删除该项目对应文件夹下的debug文件中所有文件,重新执行(1) 如 ...
- “fatal error C1859: “Release\XXXX.pch”意外的预编译头错误,只需重新运行编译器就可能修复此问题”的一个解决办法
今天又突然出现这种错误,网上的方法都搞不定. 实在无法,找到pch文件所在文件夹,一整个文件夹都删除了,然后尝试了下编译,竟然可以编译了!!! 具体什么原理不清楚,被这种情况逼到想哭的小伙伴们可以尝试 ...
- fatal error C1859: 意外的预编译头错误,只需重新运行编译器就可能修复此问题
查看项目的输出目录,删除整个目录后重新生成(pch文件所在目录,一般release目录),如果单级目录删除后仍然报该错误,删除多级目录(如x64/release),重新运行编译器.
- error:在查找预编译头时遇到意外的文件结尾
我遇到的错误是是否忘记向源文件添加"#include "pch.h"",参考下面这篇博客已解决 转载自 https://blog.csdn.net/ghevin ...
- error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include stdafx.h”
fatal error C1010: 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#include "stdafx.h (2011-09-08 22:17:50) 错 ...
- 预编译文件,预编译头文件认识
一.概念: 1.预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个"预编译头文件"的时候,则自动从这个编译 ...
最新文章
- android按下enter键如何让光标跳到下一个edittext,我们如何知道光标已经移动到edittext的下一行android...
- cuda gpu相关汇总
- vivado顶层模块怎么建_【第2040期】Node 模块化之争:为什么 CommonJS 和 ES Modules 无法相互协调...
- loadrunner之socket协议脚本编写
- java short uuid_MySQL-使用UUID_SHORT( ) 的问题
- swift 拖动按钮_ios – Swift中可拖动的UIButton / Elements?
- 如何在论坛里提高自己的从业水平
- php开发环境浏览器有哪些,ie内核浏览器有哪些
- 【转】中华吸血鬼分析
- 量子笔记:酉矩阵(幺正矩阵)、量子门的可逆性
- idea切换Git分支时弹出Git Checkout problem
- 数据结构 与游戏背包的设计
- 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟
- SCI、EI、ISTP国际三大检索分别指的是什么?
- keyshot怎么贴logo_KeyShot图文教程,三步教你如何使用添加有织纹的Logo
- webstorm 2018 激活破解方法亲测可用
- 慧择业务布局成效明显,戴维斯双击可期
- r语言实现sem_利用R语言做结构方程模型分析
- 百度地图定位API,精度提高
- 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.要递归方程,请编程实现在第n年的时候,共有多少头母牛?
热门文章
- 计算机网络(一)带宽
- 权限提升:不带引号服务路径 || 不安全的服务权限.
- 2021.1.4CHM文档制作(手动制作+软件制作+原理讲解)
- 问题一百二十九:阿基米德特性
- Iterative Soft Thresholding和Iterative Shrinkage/Thresholding的区别
- 快手直播间数据采集截流软件脚本,实时采集引流精准获取客源【采集脚本+引流技术教程】
- Elasticsearch之聚合分析
- springboot拦截请求路径_SpringBoot拦截器如何获取http请求参数
- 计算机中的英语六级作文万能模板,大学英语六级作文万能模板「议论文」
- Python Tkinter 小项目 RGB数值转换为16进制码