본문 바로가기

헛공부

PCH(Precompiled Header) 에러 해결방법 v.2

https://hutsori.tistory.com/48

 

VS에서 흔히 저지르는 PCH 에러 해결방법.

아 또 오백만년만에 다시 뵙습니다. 이렇게 글줄 몇자 쓸 시간도 없이,불철주야로 개발에만 몰두하고 있네요. 오늘 다룰 것은 PCH(Precompiled header)에 관한 에러들입니다. 일단 PCH가 무엇인고 하는

blog.logichist.com

 

이전 글이 하도 오래돼서; (무려 2012년)

사실 같은 내용인데, 이걸 질문하는 사람들이 아직도 눈에 띄네요;;

옛날 철없던 시절에 쓴 글은 몇몇 부분이 불친절해보이기도 하는데, 그냥 귀엽게 봐 주시면 감사하겠습니다.

 

 

# PCH를 왜 써요?

 

C++에서 PCH를 쓰는 이유는 해당 프로젝트 빌드 시의 컴파일 시간이 꽤 길어서,

PCH로 자주 변경되지 않는 부분에 대해서는 미리 컴파일해 둠으로써 빌드시간을 확 줄이려는 용도입니다.

자세한 내용은 검색하시면 많이 나옵니다.

 

 

# VS에서의 PCH 설정

 

PCH설정에서 문제가 생긴 경우 Project Properties 에서 해결하려고 하는 경우가 많은데,

해당 설정을 사용 안함 이나 /Yc(생성) /Yu(사용) 정도로 설정하게 됩니다. 

 

(참고) MS 에서 2024년 기준으로는 5개 옵션이 있다는군요

https://learn.microsoft.com/en-us/cpp/build/reference/y-precompiled-headers?view=msvc-170

 

/Y (precompiled headers)

Learn more about: /Y (precompiled headers)

learn.microsoft.com

 

하지만 대부분의 경우 이 수준에서 문제가 해결되지 않습니다.

옵션을 바꿔보고 빌드를 계속 해 보지만 같은 에러가 반복됩니다.

잘 모르지만 가끔 /Yc를 주고 해결되는 경우도 있습니다.

 

대체 어디가 문제였을까요?

 

 

# 경우 1) *.pch 파일이 생성되지 않았음

 

PCH 사용을 하게 되면 *.pch 파일이 생성되기 마련입니다.

이전 빌드를 모두 clean 한 경우, 혹은 pch파일을 (어떠한 이유로) 삭제한 경우라면,

PCH 옵션을 제거하였을 때(사용 안함이나 무시 등) 당연하게도 생성이 되지 않으므로(...) 

해당 헤더파일을 참조하게 되면 에러가 날 수밖에 없습니다.

 

이 경우라면 프로젝트 설정에서 /Yc 옵션을 주어 강제적으로 해결할 수도 있습니다.

다만 프로젝트 레벨에서의 /Yc 옵션은 빌드 시마다 pch를 계속 새로 생성하게 되므로,

실제 빌드 시의 컴파일 시간이 늘어납니다.

자칫 사용 안함과 동일한 효과를 낼 수 있습니다.

 

 

따라서 해당 문제를 제대로 해결하기 위해서는 다음과 같은 조치가 필요합니다.

 

 

# 경우 2) 문제는 파일 속성에 있다

 

vs의 솔루션 탐색기를 통해 해당 프로젝트에 포함된 파일 속성들을 확인하고 변경할 수 있습니다.

 

즉, 프로젝트 설정을 무시/사용안함/사용 등으로 바꿔서 계속 문제가 발생하는 이유는,

여전히 파일 레벨에서 해당 파일이 include되어 있거나 (해당 헤더 파일을 참조할 수 없음)

파일 레벨에서의 Precompiled Headers 옵션이 /Yu 일 가능성이 높습니다. (미리 컴파일된 헤더 파일을 사용할 수 없음)

 

특히 pch.cpp/stdafx.cpp 파일이 /Yu로 바뀌므로 PCH파일이 생성되지 않습니다.

따라서 어떻게 프로젝트 설정을 바꾸더라도 PCH 파일이 생성되지 않으므로(...)

해당 프로젝트를 빌드할 수가 없게 됩니다.

 

(참고) PCH관련 주요 에러: Fatal Error C1083, Compiler Error C2857

https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/fatal-error-c1083?view=msvc-170

 

Fatal Error C1083

Learn more about: Fatal Error C1083

learn.microsoft.com

https://learn.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2857?view=msvc-170

 

Compiler Error C2857

Learn more about: Compiler Error C2857

learn.microsoft.com

 

 

# 결론

 

PCH를 사용하는 신규 프로젝트를 생성해보시면 기본 설정이 /Yu로 되어 있음을 알 수 있습니다.

그런데도 아무런 문제 없이 멀쩡하게 빌드되어 출력이 나옵니다.

이는 신규 프로젝트에 포함된 pch.cpp 또는 stdafx.cpp 속성을 보면 답이 나오는데,

해당 파일의 Precompiled Header에만 /Yc 옵션이 지정되어 있기 때문입니다.

 

따라서 이전 버전의 문서에서의 해결 방법으로, 해당 파일에만 /Yc를 주라고 한 것입니다.

 

 

PCH는 애초에 자주 바뀌는 코드가 아닌, "잘 안 바뀌는" 코드들에 대한 "컴파일을 미리" 해둠으로써 

컴파일 시간을 단축시키려는 목적을 가지고 있습니다.

 

따라서 PCH를 사용하는 개발자는 어떠한 파일들을 "미리 컴파일할 것인지" 지정할 필요가 있습니다.

왜냐하면 앞서 말씀드렸듯 모든 파일을 미리 컴파일 한다는 것은 무의미하기 때문입니다.

(전체를 미리 컴파일=전체를 그냥 컴파일)

 

 

아직까지 해당 문제로 골머리를 앓고 계시는 분들께 작지만 도움이 되었으면 좋겠습니다.

(사실 이 키워드가 블로그 유입경로 1위임)

 

# 3줄 요약

 

- PCH 설정은 pch.cpp/stdafx.cpp 에서

- 12년이 지나 vs 2019이후 업데이트 반영

- PCH에러가 생기는 원인에 대해 설명