VC++에서 Precompiled header 정리

게시자: aro2jongwonlee

간간히 겪던 문제였었는데 이번 기회에 정리를 할 겸 포스트~!

1. Precompiled header 란?

compiling

Precompiled header에 대해 잘 정리된 글이 있어 잠시 가져와 본다.

C/C++ 언어에서 헤더 파일은 C 전처리기(preprocessor) 에 의해 자동적으로 소스 코드를 포함하게 된다. 그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함할 수 있고 (예를 들면 window.h), 이런 코드들을 매번 컴파일하면 컴파일 시간이 매우 길어지게 된다. 그래서 자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일 시간을 줄이고자 컴파일러가 사전에 헤더 파일들을 미리 컴파일 해 놓고 쓸 수 있게 하고 있다. 이렇게 컴파일 시간을 줄이기 위해 사전에 컴파일한 결과물이 VC의 경우 pch(precompiled header)라는 확장자 명으로 저장된다. 비주얼 스튜디어의 솔루션 폴더에 생기는 프로젝트명.pch 가 바로 그것이다. precompiled header 를 사용할 경우 precompiled header 로 지정한 헤더 파일 및 소스 코드는 컴파일시에 컴파일 되지 않고 pch의 결과물을 가져다 사용하게 되는 것이다. – soyoja님 블로그 (http://soyoja.com/372)

그렇다. 매번 컴파일이 오래 걸리는 것을 방지해주기 위하여 사용하는 것이다~!

물론 쓰면 편리한 기능인 것이고…

2. ‘c1083 cannot open precompiled header file’

Visual Studio 에서 가끔, 특히 Clean하고 난 이후에, 다음의 에러 메시지를 내고 컴파일이 안 되는 경우가 있다.
‘c1083 미리 컴파일된 헤더 파일을 열 수 없습니다.(c1083 cannot open precompiled header file)’
이 에러에 대해 msdn문서를 찾아보면, ‘결국 pch파일이 생성되지 않았다./pch파일이 존재하지 않는다.’에 결론이 도달하게 되고,
프로젝트 설정을 이것저것 건드리는 경우가 있다.
그러다보면 어떨 때는 간단히 해결이 되고,
어떨 때는 됐다, 안됐다 하고 아주 속이 터지는 경우가 있을 수 있는데,
이것 역시 잘 정리된 글이 있어 잠~시 가져와 본다.

종종 프로젝트 설정을 잘 못 만지면 pre compiled header 에 대한 오류를 볼 수 있습니다. (나만 그런가?)
그냥 pre compiled header 를 사용안함으로 해버리면 해결 됩니다.

그러나 이건 근본적인 해결책은 되지 못하겠지요. 또한 pre compiled header 를 사용하는 이점을 모두 버려야 하구요 🙂

pre compiled header 옵션이 몇가지가 있는데 모두 어떻게 동작하는지 정확히는 알지 못하겠습니다.
아무튼 난 기본 설정(미리 컴파일된 헤더 파일 사용)을 쓰고 싶단 말입니다 !!
자 ~ 원래 기본 설정(/Yu) 로 바꿔두고요..빌드를 해봅시다.
당연히 미리 컴파일된 헤더를 찾을수 없다고 떠들어 대는 컴파일러 메세지를 볼 수 있을것입니다.

이는 “미리 컴파일된 헤더” 로 지정된 stdafx.h 때문에 그렇습니다.
stdafx.cpp통해서 pch 파일을 생성하고, 나머지는 모두 만들어진 pch 를 통해서 컴파일이 됩니다.
어디선가 pch 파일을 무턱대고 복사해놓고, 빌드를 하면 일치하지 않는다는 등의 또 다른 컴파일러의 불만을 보게 되겠지요. 

stdafx.cpp 의 속성을 위와 같이 미리 컴파일된 헤더 생성(/Yc) 로 두면 문제는 해결됩니다.

– somma 님 블로그 (http://somma.egloos.com/2723641)

그렇다! Project 전체의 precompiled header 설정은 /Yu로, stdafx.cpp 파일의 precompiled header 설정은 /Yc로 하는 것이었다~!!

3. 쓸까? 말까?

내가 개발하고 있는 솔루션은 windwos, linux 모두 지원하도록 개발하고 있어서, visual studio에서는 그냥 켜고 사용하고 (그동안 별 문제가 없어서…), GCC에서는 ‘precompiled header’ 설정은 그냥 끄는 게 편하다고 생각했었다. 하지만 내용을 정리해놓고 보니 그래도 사용하는게 이래저래 장점이 많은 기능이다.

그.렇.다.면~!!!

precompiled header는 사용하는게 좋다~!

Advertisements