C++ C3859:超出PCH的虚拟内存范围
我在编译(编辑:对不起,我在这里没有说清楚:我实际上是指“重建”)我的混合模式项目时,不时(不是每次)收到这个错误消息。VisualStudio告诉我“使用'-Zm114'或更大的命令行选项重新编译”。原则上没问题,我只是按照VS告诉我的去做 但目前,这方面存在两个问题:C++ C3859:超出PCH的虚拟内存范围,c++,visual-studio-2015,compiler-errors,precompiled-headers,mixed-mode,C++,Visual Studio 2015,Compiler Errors,Precompiled Headers,Mixed Mode,我在编译(编辑:对不起,我在这里没有说清楚:我实际上是指“重建”)我的混合模式项目时,不时(不是每次)收到这个错误消息。VisualStudio告诉我“使用'-Zm114'或更大的命令行选项重新编译”。原则上没问题,我只是按照VS告诉我的去做 但目前,这方面存在两个问题: 为什么不是每次重建时都会发生这种情况?如果我理解正确,编译器在编译我的项目时内存不足。所以,如果我进行重建,清理所有先前的工作,如果我不做任何更改,下次它是否也应该耗尽内存 为了安全起见,我已经在这个项目的所有配置中为Zm指定
Zm120
)。为什么我会收到一条值较低的错误消息?或者建议值114只是对VS的粗略猜测我知道这已经很老了,但我最终还是来到了这里,所以我还是回答这个问题为好 有一篇关于PCH问题的好文章 1) 为什么不是每次重建时都会发生这种情况
这肯定有点复杂。因为它不是每次都发生,所以可能有几个问题。这很可能是由于内存分配。从文章中:
- 所需虚拟内存地址范围的碎片 CL.EXE能够将其加载到内存之前的PCH
- Windows操作系统在重载情况下无法在特定时间阈值内增加页面文件大小
确保Zm120修改处理所有构建配置(版本|调试)和平台(x86 | x64) 它还可以帮助将PreferredToolArchitecture设置为x64: 如果从命令行使用MSBuild,则可以将/p:preferredToolArchitecture=x64传递给MSBuild。如果您是从Visual Studio中使用MSBuild生成的,则可以编辑.vcxproj文件以包含包含此属性的PropertyGroup
这一点很容易被忽略,但当预编译头太大时,也会发生这种问题。做一点清理可能也是个好主意 我只是想问一下我的解决方案。似乎VisualStudio正试图为多种体系结构编译我的程序,尽管我认为我已经删除了配置文件,但在配置管理器中有大量伪造的条目要在x86模式下构建。这些对我来说是无用的,因为我只想在x64中构建。删除这些条目后,程序再次编译,此错误消失。希望它能帮助别人。这是导致此问题的另一个原因。我不清楚项目是如何进入这种状态的,但它试图使用PCH文件,将“预编译头文件”选项设置为
PCH.h
,但下面的“预编译头输出”选项为空
这并不奇怪,但VisualStudio在这方面表现得非常糟糕,尤其是在构建过程中抛出了大量的C3859
错误
整理项目配置以“继承”此值,将其修复。我在编译本地VM上的大型代码时遇到了此问题。尝试增大页面文件大小等,但无效。在我的情况下,唯一有效的方法是在Hyper-V虚拟机设置中禁用动态内存,并为虚拟机提供更多RAM,8GB->16GB
显然,VS预先分配内存,所以它只使用给VM的初始值,不会触发任何动态内存更改 由于PCH和内存问题,我们的构建在Jenkins CI管道中失败 我们的问题是WinRM对允许的外壳内存有一个较低的限制 在更新此文件并将其设置为“无限”后,我们不会再遇到与构建相关的任何内存问题
winrm.cmd set winrm/config/winrs @{MaxMemoryPerShellMB="0"}
一些背景:
- 我们的Windows构建是在Amazon AWS AMIs中完成的
- WinRM是Jenkins用来连接AMI的远程shell
- 我们使用packer来建立AMI
- 上述命令已添加到打包机引导文件中
- 上述命令来自:
- 有关配额管理的详细信息:
/Zm
部分不应该再使用Zm标志(当然也有例外)并且应该忽略致命错误C3859报告的值。请勿使用/Zm
注释上的+1。我们刚刚通过删除这些选项修复了项目内存不足的问题。这似乎对x64
不起作用。今天,当我决定用新的“铿锵整洁”代码分析设置构建调试x64项目时,我第一次遇到了这个错误。我也遇到了这个问题,并花了很长时间来解决这个问题