欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

解决 Visual Studio 编译器的堆空间不足问题(使用 CMake 版本)

最编程 2024-08-14 17:29:28
...

我们有个自动编译游戏引擎的脚本,这个脚本时间用久了,总是会报如下的错误:

fatal error C1060: 编译器的堆空间不足

每次出现这种错误,总是要请人重启机器,重新配置,很耽误时间和精力。

所以本人就在努力寻找一个彻底的解决办法。

想直接要解决方法的朋友可以跳过接下来的两节。

简单工程的解决办法

简单网上搜一下,就能搜到参考文献1。

如果你的c++工程不用cmake,参考文献1的方法足以满足你的需求。

但是我们工程比较大,肯定是要用cmake的,所以我就开始尝试各种方法: 通过改工程的cmake文件的方式来让cmake生成的vcxproj工程文件中包含PreferredToolArchitecture属性。

网上找了好久,试了不少办法,还是没用。

cmake工程的解决办法的发现过程

发现最终解决方案也是个很有趣的过程,值得记录。

首先我看见PreferredToolArchitecture父节点是PropertyGroup,而PropertyGroup下面有Platform属性,PreferredToolArchitecture和Platform是兄弟属性。

我们的Platform用x64还是win32,都是在cmake命令行里指定的。

所以我就大胆猜测,PreferredToolArchitecture这个属性如果可以通过cmake设置的话,大概率也是在cmake的命令行中设置!

接着,就是小心求证的过程,先执行: cmake --help

PS C:\Users\zvn6761> cmake --help
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Options
  -S <path-to-source>          = Explicitly specify a source directory.
  -B <path-to-build>           = Explicitly specify a build directory.
  -C <initial-cache>           = Pre-load a script to populate the cache.
  -D <var>[:<type>]=<value>    = Create or update a cmake cache entry.
  -U <globbing_expr>           = Remove matching entries from CMake cache.
  -G <generator-name>          = Specify a build system generator.
  -T <toolset-name>            = Specify toolset name if supported by
                                 generator.
  -A <platform-name>           = Specify platform name if supported by
                                 generator.

通过阅读帮助文档,辅以简单的排除法,我觉得toolset-name这个属性很可能是我要的,于是谷歌: cmake toolset name

从而找到了文档2,在文档2中发现了host=x64这个东西,但是我还不知道怎么用!于是继续搜索:cmake host=x64

找到了文档3,然后修改我们的编译脚本,加入这个编译选项,重新cmake,果然,出现了vcxproj文件中看到了PreferredToolArchitecture x64属性!

感觉成功了90%,编译工程,打开任务管理器,观察进程名称,发现c++编译器都是64位的,遂大功告成。

最终解决方法

问题的本质就是windows操作系统visual studio的默认cpp编译器是32位的,所以最大内存是4G,就容易导致编译器内存不足。

有问题的cmake指令如下:

cmake -G "Visual Studio 14 2015" -A x64 '<cmake源码目录>',

使用64位的cpp编译器的解决方法如下:

# -T host=x64 来指定默认的cpp编译器为64位的。
cmake -G "Visual Studio 14 2015" -A x64 -T host=x64 '<cmake源码目录>',

注意: cmake的GUI并没有-T host的选择,当然最新版的GUI可能也会加这个。。

还有另一种方法,添加环境变量: set PreferredToolArchitecture=x64

过一段时间,还是报堆空间不足

虽然用了64位的cpp编译器,过了一段时间,还是报堆空间不足的问题。

据观察,物理内存占用率100%,所以考虑利用空闲的磁盘空间,增大机器的虚拟内存。

win10如何设置虚拟内存的大小: https://jingyan.baidu.com/article/2fb0ba4041d14c00f3ec5f4e.html

物理内存只有32G,以前的虚拟内存是6G,我利用空闲磁盘,增大虚拟内存到100G!

参考文献

  1. fatal error C1060: “编译器的堆空间不足“——C1001错误代码 https://blog.****.net/huijielic/article/details/100075742
  2. https://cmake.org/cmake/help/v3.8/generator/Visual%20Studio%2015%202017.html
  3. https://github.com/conan-io/conan/issues/5979