티스토리 뷰

visual studio 를 사용하다 보면 이와 같은 에러를 가끔 볼수도 있을 것이다.
1.fatal error C1010: unexpected end of file while looking for precompiled header directive
2.fatal error C1852: 'Debug/test.pch' is not a valid precompiled header file

이는 소스코드에 제일 상단에 #include "stdafx.h"을 주석처리하거나, 다른 파일을 먼저 #include 하거나 할 때 발생한다. 이는 Visual C++에서 컴파일 할 때 제일상단에 #include "stdafx.h"가 있는지를 확인하는데, 발견되지 않기 때문에 발생하는 에러이다. 해결방법은 모든 cpp파일의 제일상단에 #include "stdafx.h"를 해야 한다.

3.fatal error C1853: "Debug/test.pch" is not a precompiled header file created with this compiler
#include "stdafx.h"를 모든 cpp파일의 제일상단에 포함을 했는데에도 위 에러가 발생하는 경우가 종종 있다. 해결방법은 잠시 후에 하도록 하겠다.

그럼 #include "stdafx.h"이 뭔가?
사실은 #include "stdafx.h"이 중요한 것이 아니고, precompiled header가 무엇인지 아는 것이 중요하다. 물론 자세한 내용은 MSDN-Creating Precompiled Header Files을 참조하기를 바라고, 여기서는 간단하게만 설명을 하고 넘어가겠다.

windows programming에서 제공하는 다양한 resource(button, list, combo)를 사용하여 programming을 하게 되는데, 이들 resource를 포함하여 매번 컴파일을 하게 되면 컴파일 시간이 많이 걸린다. 이를 위해서 미리 이 부분에 대해서 컴파일을 해두고, 사용자가 컴파일 할 때 이러한 미리 컴파일 된 정보를 가져와서 빨리 컴파일을 하기 위한 용도로 precompiled header라는 것을 사용한다. Visual C++에서는 default로 precompiled header를 사용하도록 설정이 되어 있으며, 처음 프로젝트를 생성하여 컴파일 할 때에는 시간이 많이 걸리지만, 이후에 자신이 작성한 소스를 생성, 수정하여 컴파일 할 때에는 빠르게 처리되는 것을 한번쯤은 느껴보았을 것이다.

다시 말하면 precompiled header로 default로 설정이 되어 있는 것이 "stdafx.h"이고, 처음 컴파일을 하면 미리 컴파일 된 정보가 name.pch(파일 확장자 pch는 precompiled header의 약자)로 Debug 또는 Release 폴더에 생성되는 것을 볼 수 있다.

"stdafx.h"는 한번쯤 열어보면, windows program으로 project를 생성한 경우, window와 관련된 다양한 header file을 #include하고 있고, 본인은 여기에 모든 소스에 공통적으로 사용되기를 원하는 #define, #pragma(lib 처리를 위해 종종 사용, 자세한 것은 다음 시간에)등에 활용하기도 한다.

마지막으로 어떤 소스들은 #include "stdafx.h"를 제일상단에 포함을 하지 않았는데에도 아무런 에러가 발생하지 않는 경우가 있다. 이는 precompiled header를 사용하지 않겠다고 지정을 한 경우이다.

메뉴>Project/Settings
사용자 삽입 이미지
<visual studio 2008 캡처화면>
위항목과 같이 설정해 보도록 하자
Precompiled Header File 항목은 .\Debug/프로젝트명.pch 로 하면 될것이다.

precompiled header를 이용하지 않거나, 다른 파일로 precompiled header를 설정할 수도 있다. 이를 이용하여 위의 3번 에러에 대한 수정도 할 수 있다.

#include "stdafx.h"와 precompiled header는 매우 자주 접하게 되는 에러와 연관이 있기 때문에 한번쯤 관심 있게 살펴보는 것이 매우 중요하다고 생각이 된다.