C3859:PCH的虚拟内存范围超过

时间:2016-07-20 11:17:13

标签: c++ visual-studio-2015 compiler-errors precompiled-headers mixed-mode

我不时得到这个错误信息(不是每次)我编译(编辑:对不起,我没有在这里说清楚:我的意思是"重建")我的混合 - 模式项目。 Visual Studio告诉我使用命令行选项' -Zm114'重新编译。或更大的"。原则上没问题,我就像VS告诉我的那样。

但目前,这有两个问题:

  1. 为什么每次我都不会重建?如果我理解正确,编译我的项目时编译器内存不足。因此,如果我进行重建,清除以前的所有工作,如果我没有改变任何东西,下次不应该没有内存吗?

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

5 个答案:

答案 0 :(得分:3)

我知道这已经老了,但我最终到了这里,所以我不妨回答。

关于PCH问题有一篇很棒的文章here

1)为什么每次重建都不会发生?
这肯定有点复杂。由于它不是每次都发生,它可能是几个问题。这很可能是由于内存分配造成的。来自文章:

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

它也可能是页面文件大小问题(最有可能在虚拟机上),但我相信你会有类似这样的消息:

  

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

2)为什么我收到此值较低的错误消息? (Zm114代替Zm120)
确保Zm120修改处理所有构建配置(Release | Debug)和Platform(x86 | x64)。

也可以将PreferredToolArchtecture设置为x64:

  

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

这个很容易被忽略,但是当预编译的标题太大时,也会发生这种问题。做一点清理也许是一个好主意。

答案 1 :(得分:1)

我遇到了在本地VM上编译大型代码的问题。尝试增加页面文件大小等,但没有用。在我的情况下,唯一有效的方法是在Hyper-V VM设置中禁用动态内存,并为VM提供更多的RAM,即8GB-> 16GB。

显然,VS预先分配了它的内存,因此它仅使用提供给VM的初始值,并且不会触发任何动态内存更改。

答案 2 :(得分:1)

由于 PCH 和内存问题,我们的构建在 Jenkins CI 管道中失败。

我们的问题是 WinRM 对允许的 shell 内存有一个较低的限制。

更新此内容并将其设置为无限制后,我们不会再遇到与构建相关的内存问题。

winrm.cmd set winrm/config/winrs @{MaxMemoryPerShellMB="0"}

一些背景:

答案 3 :(得分:0)

只需了解解决方案最终适合我的情况。尽管我认为我已经删除了配置文件,但Visual Studio似乎正在尝试针对多种体系结构编译我的程序,但在配置管理器中有一堆虚假条目要以x86模式构建。这些对我没用,因为我只想在x64中构建。删除这些条目后,程序再次编译,该错误消失了。希望对别人有帮助。

答案 4 :(得分:0)

这个问题的另一个原因。我不清楚项目是如何进入这种状态的,但是它试图使用PCH文件,并将“预编译头文件”选项设置为pch.h,但是下面的“预编译头输出”选项是空的。

不足为奇,但是Visual Studio对此一无所知,特别是在构建过程中引发了许多C3859错误。

将项目配置排序为“继承”,此值将其立即修复。