【问题标题】:Use 64 bit compiler in Visual Studio在 Visual Studio 中使用 64 位编译器
【发布时间】:2018-03-22 20:07:18
【问题描述】:

我使用 Visual Studio 2017。在一个项目中(我的目标是 x64),我收到错误:C1060,编译器的堆空间不足,遗憾的是,编译时碰巧存在内存限制。

在监控 CL.exe 时,它​​确实在达到 4GB 之前停止。所以看起来 CL.exe 默认是一个 32 位应用程序,见:https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line

阅读此页面后,我安装了“通用 Windows 平台工作负载”,希望能够访问 64 位版本的 CL.exe。但是在编译我的项目时没有任何变化,而且我在 Visual Studio 中看不到一个选项来选择编译器版本。

我认为必须存在一种解决方法才能为单个编译单元使用超过 4GB 的空间,但我现在找不到它。任何帮助将不胜感激。

编辑:我在调试模式下遇到了限制。编译在发布模式下运行良好。这是有道理的。

【问题讨论】:

  • 你有没有试过弄清楚为什么编译需要这么多内存?这可能是由严重的代码问题引起的,例如模板膨胀。
  • 我想解决方法是通过分解它们来减小编译单元的大小或复杂性(这样编译器就不会消耗那么多内存)。你没有提供任何关于你为什么不能这样做的信息。你的编译单元这么大的原因是什么?
  • ... 虽然有一些方法可以让递归终止,但如果您正在编译跨平台,您可能会不小心引入了一个错误,它在 CLang 或 GCC 下终止,但在 MSVC 下没有终止。例如,当对一个类型使用不同的名称时,CLang 下的类型可能相同,但 MSVC 下的类型可能不同,具体取决于编译器选项等。
  • 已编辑问题:在发布模式下正常
  • 项目 > 属性 > VC++ 目录 > 可执行目录设置。将 $(VC_ExecutablePath_x86) 更改为 $(VC_ExecutablePath_x64_x86)。顺便说一句,这在 RTM 版本中被破坏了,不知道他们是否修复了它。

标签: c++ visual-studio-2017 cl


【解决方案1】:

默认情况下,Visual Studio 使用 32 位工具链(即编译器是 32 位并交叉编译 64 位可执行文件)。 Visual Studio 2015 和 2017 包括所有编译器(x86、x64、arm、arm64)的 32 位和 64 位版本。

您可以通过两种方法选择在 64 位系统上使用 64 位工具链:

  1. 在您的构建机器上添加一个环境变量(系统范围或来自 VS 开发人员命令提示符)。

例如:

set PreferredToolArchitecture=x64
devenv
  1. 您也可以使用<PreferredToolArchitecture>x64</PreferredToolArchitecture> 元素编辑您的vcxproj 文件:

例如:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v141</PlatformToolset>
    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>

我在我的Direct3D Game VS Templates 的 UWP (C++/WinRT) 版本中使用了第二种方法,我只是注意到我应该将它添加到我的 UWP (C++/CX) 和 Win32 版本中。 Xbox One XDK 也会在其平台构建规则中自动执行此操作。

注意这个问题过去已经回答过:How to make Visual Studio use the native amd64 toolchain

【讨论】:

  • 完美,&lt;PreferredToolArchitecture&gt;x64&lt;/PreferredToolArchitecture&gt; 成功了。对完整的 sn-p 关于将更改放在哪里的额外赞誉。
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2017-08-03
  • 2023-03-06
  • 2011-03-04
相关资源
最近更新 更多