Share via


编译器错误 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 所需的内存很可能已被保留。