C3859:超出了PCH的虚拟内存范围

der*_*her 5 c++ mixed-mode compiler-errors precompiled-headers visual-studio-2015

我不时(并非每次)都收到此错误消息,我在混合模式项目中进行了编译(编辑:对不起,我在这里并没有明确指出:我的意思是“重建”)。而且Visual Studio告诉我“使用'-Zm114'或更高版本的命令行选项重新编译”。原则上没问题,我只是按照VS告诉我的那样做。

但是目前,这有两个问题:

  1. 为什么在每次重建时不会发生?如果我理解正确,则编译器在编译项目时会耗尽内存。因此,如果我进行重建以清理所有先前的工作,如果我什么都没做,它下次是否也不会耗尽内存?

  2. 为了安全起见,我已经Zm120在该项目的所有配置中为Zm(即)指定了120的值。为什么我收到一个错误消息,该值较低?还是114的建议值只是对VS的疯狂猜测?

Sco*_*ott 13

我知道这很旧,但我最终来到了这里,所以我不妨回答一下。

有一个关于PCH的问题一个伟大的文章在这里

1)为什么不是每次我进行重建时都会发生?
肯定回答这个有点复杂。由于它不是每次都发生,因此可能有几个问题。这很可能是由于内存分配。从文章:

  • 在 CL.EXE 能够将其加载到内存之前,PCH 所需的虚拟内存地址范围的碎片化。
  • Windows 操作系统在重负载下无法在特定时间阈值内增加页面文件大小。

它也可能是页面文件大小问题(最有可能在虚拟机上),但我相信您会收到类似于以下内容的消息:

c1xx:错误 C3859:无法为 PCH [...Project.vcxproj] 创建虚拟内存 c1xx:注意:系统返回代码 1455:页面文件太小,无法完成此操作

2)为什么我会收到具有较低值的错误消息?(Zm114 而不是 Zm120)
确保 Zm120 修改处理所有构建配置(发布|调试)和平台(x86|x64)。

将 PreferredToolArchtecture 设置为 x64 也有帮助:

如果您从命令行使用 MSBuild,则可以将 /p:PreferredToolArchtecture=x64 传递给 MSBuild。如果在 Visual Studio 中使用 MSBuild 进行构建,则可以编辑 .vcxproj 文件以包含包含此属性的 PropertyGroup。

这个很容易被忽略,但是当预编译头太大时也会出现这种问题。做一点清理也可能是个好主意。