设为首页 收藏本站
查看: 624|回复: 0

Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunni

[复制链接]

尚未签到

发表于 2015-5-9 12:58:21 | 显示全部楼层 |阅读模式
  
  Visual C++ 在windows 7 上预编译头错误unexpected precompiled header error, simply rerunning the compiler might fix this problem
  
  之前有人在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
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65244-1-1.html 上篇帖子: Windows Phone 7范例游戏Platformer实战5——多点触控编程 下篇帖子: Windows Phone 7 旋转动画(RotateTransform)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表