Используйте 64-битный компилятор в Visual Studio

Я использую Visual Studio 2017. В проекте (который я нацелен как x64) я получаю сообщение об ошибке: C1060, компилятору не хватает места в куче, и, к сожалению, выяснилось, что существует ограничение памяти для компиляции.

При мониторинге CL.exe он действительно останавливается незадолго до достижения 4 ГБ. Таким образом, похоже, что 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 для выбора версии компилятора.

Я предполагаю, что должен существовать обходной путь, чтобы иметь возможность использовать более 4 ГБ для одной единицы компиляции, но я пока не смог его найти. Любая помощь приветствуется.

Изменить: я нажал ограничение в режиме отладки. В режиме выпуска компиляция выполняется нормально. Что, предположим, имеет смысл.


person brahmin    schedule 11.10.2017    source источник
comment
Вы пытались выяснить, почему компиляции требуется столько оперативной памяти? Это может быть вызвано серьезными проблемами кода, такими как раздувание шаблона.   -  person user7860670    schedule 11.10.2017
comment
Я полагаю, что обходной путь состоит в том, чтобы уменьшить размер или сложность единиц компиляции, разбив их (чтобы компилятор не потреблял так много памяти). Вы не предоставили никакой информации о том, почему вы не можете этого сделать. В чем причина того, что ваш модуль компиляции такой большой?   -  person Ben    schedule 11.10.2017
comment
Это проект, в значительной степени ориентированный на шаблоны. Я не упоминал об этом, поскольку это немного выходит за рамки вопроса. Итак, короткий ответ: нет, я не могу разделить модуль компиляции. И он отлично работает на других платформах, таких как Xcode или Linux.   -  person brahmin    schedule 11.10.2017
comment
Я согласен с тем, что проблемы с шаблоном @VTT являются наиболее вероятной причиной неконтролируемого использования памяти компилятором. Например, вы можете рекурсивно создавать экземпляр шаблона.   -  person Ben    schedule 11.10.2017
comment
... и хотя есть способы сделать эту работу при условии прекращения рекурсии, если вы компилируете кросс-платформенный, вы могли случайно ввести ошибку, при которой она завершается в CLang или GCC, но не в MSVC. Например, при использовании разных имен для типа типы могут быть одинаковыми в CLang, но разными в MSVC, в зависимости от параметров компилятора и т. Д.   -  person Ben    schedule 11.10.2017
comment
Отредактированный вопрос: нормально в режиме выпуска   -  person brahmin    schedule 11.10.2017
comment
Проект ›Свойства› Каталоги VC ++ ›Настройка исполняемых каталогов. Измените $ (VC_ExecutablePath_x86) на $ (VC_ExecutablePath_x64_x86). Это было сломано в выпуске RTM, кстати, не знаю, исправили ли они это еще.   -  person Hans Passant    schedule 11.10.2017
comment
Ты герой @HansPassant, спасибо. Я добавил $ (VC_ExecutablePath_x64_x86) и $ (VC_ExecutablePath_x64_x64), и он компилируется. Мне не удалось найти способ отследить CL.exe и убедиться, какой из них используется, но похоже, что это x64, поскольку при его мониторинге он превысил 4 ГБ. Не стесняйтесь добавлять ответ.   -  person brahmin    schedule 11.10.2017


Ответы (1)


По умолчанию 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

person Chuck Walbourn    schedule 13.10.2017