Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C3859:超出PCH的虚拟内存范围_C++_Visual Studio 2015_Compiler Errors_Precompiled Headers_Mixed Mode - Fatal编程技术网

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

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指定

我在编译(编辑:对不起,我在这里没有说清楚:我实际上是指“重建”)我的混合模式项目时,不时(不是每次)收到这个错误消息。VisualStudio告诉我“使用'-Zm114'或更大的命令行选项重新编译”。原则上没问题,我只是按照VS告诉我的去做

但目前,这方面存在两个问题:

  • 为什么不是每次重建时都会发生这种情况?如果我理解正确,编译器在编译我的项目时内存不足。所以,如果我进行重建,清理所有先前的工作,如果我不做任何更改,下次它是否也应该耗尽内存

  • 为了安全起见,我已经在这个项目的所有配置中为Zm指定了120的值(即
    Zm120
    )。为什么我会收到一条值较低的错误消息?或者建议值114只是对VS的粗略猜测


  • 我知道这已经很老了,但我最终还是来到了这里,所以我还是回答这个问题为好

    有一篇关于PCH问题的好文章

    1) 为什么不是每次重建时都会发生这种情况
    这肯定有点复杂。因为它不是每次都发生,所以可能有几个问题。这很可能是由于内存分配。从文章中:

    • 所需虚拟内存地址范围的碎片 CL.EXE能够将其加载到内存之前的PCH
    • Windows操作系统在重载情况下无法在特定时间阈值内增加页面文件大小
    这也可能是页面文件大小问题(最有可能是在虚拟机上),但我相信您会收到类似的信息:

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

    2) 为什么我会收到一条值较低的错误消息?(Zm114代替Zm120)
    确保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
    • 上述命令已添加到打包机引导文件中
    • 上述命令来自:
    • 有关配额管理的详细信息:

    PCH文件只能生成一次。如果您遇到此错误,那么您更改了PCH中包含的.h文件,当然,这种更改再次触发错误的可能性为非零。最终,这可能是一种不好的做法,您应该修剪PCH,使其只使用永远不会更改的标题。h是好的,像Boost这样的库是好的。像string.h这样的东西太小了。这不会触发C3859。@HansPassant是的,我理解预编译头的概念。但是重建也应该重建预编译的头文件。因此,如果我什么也不更改(没有文件,没有编译器选项),只是点击“重建”,那么错误应该会再次发生,不是吗?根据(搜索忽略/Zm标志),从MSVS 2015开始,问题的
    /Zm
    部分不应该再使用Zm标志(当然也有例外)并且应该忽略致命错误C3859报告的值。请勿使用
    /Zm
    注释上的+1。我们刚刚通过删除这些选项修复了项目内存不足的问题。这似乎对
    x64
    不起作用。今天,当我决定用新的“铿锵整洁”代码分析设置构建调试x64项目时,我第一次遇到了这个错误。我也遇到了这个问题,并花了很长时间来解决这个问题