编译器错误 C3859
未能创建 PCH 的虚拟内存
该消息具有以下说明之一:
系统返回了代码“错误代码”:OS 错误消息
PCH:地址不是系统分配间距的倍数
PCH:之前未保留区块
PCH:提交大小过大
PCH:无法跨文件映射提交内存
PCH:提交所有字节前,区块列表已用完
PCH:尝试释放时,意外地遇到区块列表结尾
PCH:在回收时,不应该命中文件映射
PCH:区块无效
PCH:映射大小过大
PCH:无法映射文件:内存已提交
PCH:文件映射已映射就位
PCH:无法获得请求的内存块
请考虑使用 /Fp 让编译器提前保留内存
为预编译标头 (PCH) 分配的虚拟内存不足。 如果预编译标头使用显式 #pragma hdrstop
指令,请使用 /Zm
编译器标志为预编译头文件指定更大的值。 否则,请考虑减少生成中的并行编译进程数。 有关详细信息,请参阅 /Zm
(指定预编译标头内存分配限制)。
此诊断主要显示在两种场景中:
第一种场景是系统同时重载多个 /Yu
编译请求。 设置最大启动虚拟内存大小通常可解决此问题。
第二种场景是 Windows 加载程序在启动时将 DLL 注入进程。 注入的 DLL 可以分配与 PCH 必须驻留的位置冲突的内存。 例如,msbuild.exe
在启动时将 FileTracker.dll
注入每个 CL.exe
进程。 在此场景中,使用 /Fp
(Name .pch 文件) 标志可确保注入的 DLL 在尝试占用地址空间之前在 CL.exe
进程中尽早分配 PCH 的内存。 这些失败可能是间歇性的,因为 Windows 地址空间布局随机化 (ASLR) 在不同的进程调用中在不同的地址分配内存。 如果没有 /Fp
,则在编译器找到 /Yu
命令行选项或 #pragma hdrstop
中指定的头文件 #include
之后,才可分配 PCH 的内存。 此时,PCH 所需的内存很可能已被保留。