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的补丁包里中出现,   你现在则可以这样弄:

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

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

重启机器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值