【问题标题】:C3859: Virtual memory range for PCH exceededC3859:超出 PCH 的虚拟内存范围
【发布时间】:2016-11-23 14:28:42
【问题描述】:

我不时收到此错误消息(不是每次)我编译(编辑:抱歉,我在这里没有说清楚:我实际上是指“重建”)我的混合模式项目。 Visual Studio 告诉我“使用 '-Zm114' 或更高版本的命令行选项重新编译”。原则上没问题,我就照VS说的做。

但目前,这样做有两个问题:

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

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

【问题讨论】:

  • 一个 PCH 文件应该只生成一次。如果您遇到此错误,那么您更改了包含在 PCH 中的 .h 文件,当然,这种更改再次触发错误的可能性非零。最终,这可能是一种不好的做法,您应该修剪 PCH 以仅使用永不更改的标头。 Windows.h 很好,像 Boost 这样的库也很好。像 string.h 这样的东西太小了,无法打扰。这不会触发 C3859。
  • @HansPassant 是的,我理解预编译头的概念。但是重建也应该重建预编译的头文件。因此,如果我什么都不改变(没有文件,没有编译器选项)并且只是点击“重建”,错误应该会再次发生,不是吗?
  • 至于问题的/Zm 部分,根据here(搜索忽略 /Zm 标志),从 MSVS 2015 开始,不应再使用 Zm 标志(有例外当然)并且应该忽略致命错误 C3859 报告的值。
  • +1 不要使用/Zm 评论。我们刚刚通过删除这些选项来解决我们项目的内存不足问题。看来这可能不适用于<PreferredToolArchitecture>x64</PreferredToolArchitecture>
  • 今天当我决定使用新的“Clang-tidy”代码分析设置构建我的 DEBUG x64 项目时,我第一次遇到此错误。

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


【解决方案1】:

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

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

1) 为什么每次重建时都不会出现这种情况?
肯定回答这个有点复杂。由于并非每次都发生,因此可能有几个问题。这很可能是由于内存分配。来自文章:

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

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

c1xx : error C3859: Failed to create virtual memory for PCH [...Project.vcxproj] c1xx: 注意:系统返回代码 1455:分页文件太小,无法完成此操作

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

将 PreferredToolArchtecture 设置为 x64 也有帮助:

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

这个很容易被忽略,但是当预编译的头文件太大时也会发生这种问题。做一些清理工作也可能是个好主意。

【讨论】:

    【解决方案2】:

    只是插话解决方案最终对我来说是什么。似乎 Visual Studio 试图为多种架构编译我的程序,尽管我认为我已经删除了配置文件,但配置管理器中有一堆虚假条目以 x86 模式构建。这些对我来说没用,因为我只想在 x64 中构建。删除这些条目后,程序再次编译,此错误消失了。希望它可以帮助某人。

    【讨论】:

      【解决方案3】:

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

      并不令人惊讶,但 Visual Studio 对此非常不满意,尤其是在构建过程中抛出了许多 C3859 错误。

      将项目配置整理为“继承”此值即可修复。

      【讨论】:

        【解决方案4】:

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

        显然 VS 会预先分配它的内存,所以它只使用给虚拟机的初始值,不会触发任何动态内存更改。

        【讨论】:

          【解决方案5】:

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

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

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

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

          一些背景:

          【讨论】:

          • 我也遇到了这个问题,并且花了很长时间试图弄清楚我的编译器设置、工具链、构建选项发生了什么。最后,当然是 WinRM。如果我可以多次投票,我会
          猜你喜欢
          • 2013-09-12
          • 2021-02-24
          • 2011-05-23
          • 1970-01-01
          • 2021-04-15
          • 2020-08-09
          • 2021-09-06
          • 1970-01-01
          • 2017-09-12
          相关资源
          最近更新 更多