在Visual Studio中使用64位编译器。

18

我使用Visual Studio 2017。在一个项目中(我将其目标设置为x64),我遇到了error:C1060,编译器的堆空间已用尽的错误,很遗憾得知编译存在内存限制。

当监视CL.exe时,它确实在接近4GB之前停止。因此看起来CL.exe默认是一个32位应用程序,如https://learn.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,但是我目前还没有找到它。任何帮助都将不胜感激。

编辑:我在调试模式下遇到了限制。在发布模式下编译正常。这似乎是有道理的。


4
你有没有试图弄清为什么编译需要这么多内存?这可能是由于严重的代码问题,例如模板膨胀等原因。 - user7860670
1
虽然有方法可以使递归终止,但如果您正在进行跨平台编译,则可能会意外引入错误,导致在CLang或GCC下终止,但在MSVC下不终止。例如,在使用不同名称的类型时,这些类型在CLang下可能相同,但在MSVC下可能不同,具体取决于编译器选项等。 - Ben
1
编辑后的问题:在发布模式下正常。 - brahmin
3
在项目属性中的VC++目录下,找到可执行文件目录设置。将$(VC_ExecutablePath_x86)更改为$(VC_ExecutablePath_x64_x86)。顺便提一句,这在RTM版本中存在问题,不确定它们是否已经修复了。 - Hans Passant
你是英雄@HansPassant,谢谢。我添加了$(VC_ExecutablePath_x64_x86)和$(VC_ExecutablePath_x64_x64),现在可以编译了。我找不到追踪CL.exe并确保使用哪个的方法,但看起来是x64,因为当监视它时,它超过了4GB。欢迎添加答案。 - brahmin
显示剩余3条评论
1个回答

30

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

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

  1. 在构建机器上添加环境变量(可以是系统范围内的或从VS开发人员命令提示符中添加)。

例如:

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

例如:

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

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

请注意,这个问题在过去已经得到了解答:如何让Visual Studio使用本机amd64工具链

更新:VS 2022是64位本地化的,因此默认使用64位工具。它还默认使用64位MSBuild,而旧产品默认使用32位MSBuild。


完美,<PreferredToolArchitecture>x64</PreferredToolArchitecture>解决了问题。如果能提供关于更改位置的完整代码片段,将会获得额外的赞誉。 - Cerno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接