다음을 통해 공유


컴파일러 오류 C3859

PCH에 대한 가상 메모리를 만들지 못했습니다.

메시지에는 다음 메모 중 하나가 있습니다.

시스템에서 반환된 코드 오류 코드: OS 오류 메시지
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는 시작 시 모든 CL.exe 프로세스에 FileTracker.dll을 삽입합니다. 이 시나리오에서 /Fp(이름 .pch 파일) 플래그를 사용하면 삽입된 DLL이 주소 공간을 차지하려고 하기 전에 PCH용 메모리가 CL.exe 프로세스에서 최대한 빨리 할당되도록 할 수 있습니다. Windows ASLR(Address Space Layout Randomization)은 다양한 프로세스 호출을 통해 다양한 주소에 메모리를 할당하기 때문에 이러한 오류가 일시적으로 발생할 수 있습니다. /Fp가 없으면 컴파일러가 /Yu 명령줄 옵션 또는 #pragma hdrstop에 지정된 헤더 파일 #include를 찾을 때까지 PCH용 메모리를 할당할 수 없습니다. 이 시점에는 PCH에 필요한 메모리가 이미 예약되어 있을 가능성이 훨씬 더 높습니다.