【问题标题】:Visual Studio Express: fatal error c1060, the compiler is out of heap spaceVisual Studio Express:致命错误 c1060,编译器堆空间不足
【发布时间】:2014-07-17 23:59:22
【问题描述】:

我正在尝试使用 VC 11 从其源代码构建一个程序,当编译器即将完成时,它会引发标题错误。 正如我在这里和其他论坛中所读到的那样,我已经尝试过尽可能多地关闭程序并扩大 Windows 中交换文件的大小......它们不起作用。

我读过一个名为 \Zm 的参数,但我不明白如何使用它。

你能帮帮我吗?

【问题讨论】:

  • 关于如何使用 /Zm 标志的说明在这里:msdn.microsoft.com/en-us/library/bdscwf1c.aspx
  • 谢谢,但我已经读过了。事实是我通过命令行用 cmake 和用 nmake 编译...而不是用 ide
  • 编译器占用了多少内存?你可以在任务管理器中查看(cl.exe)
  • 是否可以运行 64 位工具集?这通常可以解决导致 C1060 的堆空间问题。 (如果您在运行 64 位工具集时仍然遇到堆问题,那么您的预编译头文件可能有其他问题。)How to: Enable a 64-Bit Visual C++ Toolset on the Command Line 中有一些讨论,尽管我承认不熟悉它与 cmake 的交互方式。

标签: visual-studio visual-c++ visual-studio-2012 compiler-errors


【解决方案1】:

看看this documentation which gives possible solutions

我也遇到过这个问题,发现文档很有用。要点:

  1. 如果编译器也发出错误 C1076 和 C3859,请使用 /Zm 编译器选项来降低内存分配限制。更多堆空间 如果您降低剩余内存,则可用于您的应用程序 分配。

    如果 /Zm 选项已设置,请尝试将其删除。堆空间可能是 由于选项中指定的内存分配限制而耗尽 太高了。如果您删除 /Zm,编译器将使用默认限制 选项。

  2. 如果您在 64 位平台上编译,请使用 64 位编译器工具集。有关信息,请参阅如何:启用 64 位 Visual C++ 命令行工具集。

  3. 在 32 位 Windows 上,尝试使用 /3GB boot.ini 开关。

  4. 增加 Windows 交换文件的大小。

  5. 关闭其他正在运行的程序。

  6. 消除不必要的包含文件。

  7. 消除不必要的全局变量,例如,通过动态分配内存而不是声明一个大数组。

  8. 消除未使用的声明。

  9. 将当前文件拆分成更小的文件。

【讨论】:

  • 对我来说,使用 64 位编译器工具集是最好的选择。
【解决方案2】:

关于 /Zm 参数我不能说太多,但我遇到了同样的问题(编译器堆空间不足)。

对我有帮助的是 /m:4(CPU 数量为 4)参数,这样您就可以使用多个 CPU 进行构建。

希望对你也有帮助。

另外,如果您在 x64 上运行,请确保正在使用 x64 版本的“msbuild.exe”和“cl.exe”。我有一个问题,即使使用例如x64 ms powershell,编译器仍会选择 32 位版本的 msbuild.exe(在任务管理器“msbuild.exe*32”中,windows 7)

【讨论】:

    【解决方案3】:

    我们也遇到过类似的问题:一个相对简单的程序(尽管充满了模板,使用了 Eigen 库)在其中一台计算机上一直无法编译。所有人都在使用 MSVC2013 x64,但由于 C1060 错误,只有一个无法编译程序。我们尝试了不同的编译器标志,设置/取消设置 -Zm,但在不修改代码的情况下无法解决它。

    然而,当我们从 x64/x64(用于生成 64 位可执行文件的 64 位编译器)版本的编译器切换到 x86/x86(用于生成 32 位生成可执行文件的 32 位编译器)时,我们得到了一些指示。 x86 编译器为我们提供了程序有问题部分的确切位置——调用模板函数接收大量模板化对象。我们已经将它们重写为普通函数(构建在不同的目标文件中)并且解决了问题......

    【讨论】:

      【解决方案4】:

      除了此处的其他答案(在我的情况下)之外,fatal error C1060: compiler is out of heap space 可能是由语法错误引起的。即使使用正确的编译器选项,以下代码(在某些情况下)也可能导致此错误 - 例如,如果您之前已成功编译过相同的程序。

      r.push_back(e[1];
      

      而不是

      r.push_back(e[1]);
      

      re 属于某些类型时,似乎只会导致此错误而不是标准error C2143: syntax error: missing ')' before ';',但如果程序之前编译时没有错误,则值得检查您最近编辑的任何代码。

      【讨论】:

        【解决方案5】:

        VS:Visual Studio 2015 操作系统:Windows10

        如果您使用 VS2015 作为您的 IDE,也许还有另一种解决方案: 去更新VS2015“Update3”包,一切顺利。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-10
          • 2011-06-04
          • 2018-12-21
          • 2021-03-19
          • 1970-01-01
          • 2015-10-03
          • 2020-06-13
          • 1970-01-01
          相关资源
          最近更新 更多