Ошибка компилятора C3859
Не удалось создать виртуальную память для PCH
Сообщение содержит одно из следующих заметок:
Код ошибки кода, возвращенный системой: сообщение об ошибке ОС
PCH: адрес не является нескольким из детализации распределения системы
PCH: блок не был зарезервирован ранее
PCH: слишком большой размер фиксации
PCH: не удается зафиксировать память на карте файлов
PCH: исчерпанный список блоков перед фиксацией всех байтов
PCH: непредвиденный конец списка блоков при попытке освободить
PCH: не следует ударять по карте файлов в случае вывода из эксплуатации
PCH: недопустимый блок
PCH: слишком большой размер карты
PCH: не удается сопоставить файл: память уже зафиксирована
PCH: карта файлов уже на месте
PCH: не удается получить запрошенный блок памяти
Рекомендуется использовать /Fp, чтобы компилятор зарезервировать память раньше
Недостаточно виртуальной памяти, выделенной для предварительно скомпилированного заголовка (PCH). Если предкомпилированный заголовок использует явную #pragma hdrstop
директиву, используйте /Zm
флаг компилятора, чтобы указать большее значение для предварительно скомпилированного файла заголовка. В противном случае рекомендуется уменьшить количество параллельных процессов компиляции в сборке. Дополнительные сведения см. в разделе /Zm
(Указание ограничения выделения памяти предварительной компиляции заголовка).
Эта диагностика отображается в основном в двух сценариях:
Первый сценарий заключается в том, что система перегружена несколькими /Yu
запросами компиляции одновременно. Установка максимального начального размера виртуальной памяти обычно устраняет эту проблему.
Второй сценарий заключается в том, что загрузчик Windows внедряет библиотеку DLL в процесс при запуске. Эта внедренная библиотека DLL может выделить память, которая конфликтует с местом расположения PCH. Например, msbuild.exe
внедряется FileTracker.dll
в каждый CL.exe
процесс при запуске. В этом сценарии использование флага /Fp
(PCH-файла name) гарантирует, что память для PCH выделяется как можно раньше в CL.exe
процессе, прежде чем все внедренные библиотеки DLL пытаются занять адресное пространство. Эти сбои могут быть периодическими, так как случайное распределение пространства адресов Windows (ASLR) выделяет память по разным адресам в разных вызовах процесса. Без /Fp
этого память для PCH не может быть выделена, пока компилятор не найдет файл #include
заголовка, указанный в параметре командной /Yu
строки или .#pragma hdrstop
К этому времени гораздо более вероятно, что память, требуемая PCH, уже зарезервирована.