Precompiled header 에 대해서 ( stdafx.h 와 stdafx.cpp )

Visual C++ 위자드로 자동 생성되는 코드들 중에서 stdafx.hstdafx.cpp 이 있다. 

여기에서 stdafx 란 Standard Application Freamworks 의 약자로 개발자들의 생산성 향상을 위해 MS 에서 제공하는 소프트웨어 라이브러리 체계를 뜻하며, MFC 로 구성되어 있다. 
참고로 많이 사용되는 application framework 로는 .NET Framework( Windows 계열 ),  Cocoa ( Objective C / Mac OS X), Swing (Java) 등이 있다.

그럼 Precompiled header (미리 컴파일된 헤더. 여기에서는 precompiled header 로 통일) 란 무엇인가... 

C / C++ 언어에서 헤더 파일은 C 전처리기(preprocessor) 에 의해 자동적으로 소스 코드를 포함하게 된다. 

그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함할 수 있고( 예를 들면 window.h), 이런 코드들을 매번 컴파일하면 컴파일 시간이 매우 길어지게 된다. 그래서 자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일 시간을 줄이고자 컴파일러가 사전에 헤더 파일들을 미리 컴파일 해 놓고 쓸 수 있게 하고 있다. 

이렇게 컴파일 시간을 줄이기 위해 사전에 컴파일한 결과물이 VC 의 경우 pch(precompiled header) 라는 확장자 명으로 저장된다. 비주얼 스튜디어의 솔루션 폴더에 생기는 프로젝트명.pch 가 바로 그것이다. precompiled header 를 사용할 경우 precompiled header 로 지정한 헤더 파일 및 소스 코드는 컴파일시에 컴파일 되지 않고 pch 의 결과물을 가져다 사용하게 되는 것이다. 


자.. 이제 원리를 이해했으니 많은 궁금중들이 풀릴 수 있다. 

질문 1 ) stdafx.h 와 stdafx.cpp 파일의 용도가 무엇인가요?  stdafx.h 가 포함하는 정보는 무엇들인가요? 

앞서 말했듯이 MFC 에서 자주 사용되는 공용 소스들을 precompiled header 로 만들어 제공하기 위해 디폴트로 stdafx.h 와 sfdafx.cpp 이 위자드에서 자동 생성되는 것이다. 참고로 precompiled header 는 stdafx.h 외에 다른 파일들을 설정할 수도 있다. (아래 그림과 같이..)

VC 에서는 프로젝트 속성 - C/C++ - 미리 컴파일된 헤더 항목에서 Precompiled header 사용 여부를 선택할 수 있다. 



stdafx.h 에 포함하는 내용들을 살펴보면 윈도우 객체 생성에 필요한 기본 클래스 (afx.h / afxwin.h 등),  윈도우 컨트롤( afxctl.h / afxcmn.h 등), 기본 DB 관련 클래스 ( afxdb.h / afxdao.h ), 네트워크 관련 클래스 ( afxsock.h ) 등등 기본적인 프레임워크 구축에 필요한 필수 헤더들이 포함되어 있다. 


질문 2 ) 다음의 에러들은 무엇인가요 

에러 : fatal error C1010: unexpected end of file while looking for precompiled header directive
미리 컴파일된 헤더 지시문을 찾는 동안 예기치 않은 파일의 끝이 나타났습니다
( 혹은 버전에 따라 "Did you forget to add '#include "stdafx.h"' to your source?" 라는 문구가 표시되기도 함 )

해결방안 :  precompiled header 를 사용하도록 설정된 상태에서 컴파일을 하였는데 precompiled header 를 찾지 못했다는 의미. 
보통 해당 소스코드에 stdafx.h 가 인클루드 되어 있지 않거나, stdafx.h 의 위치가 잘못 되어 있어서 발생한다.  
stdafx.h 를 소스코드의 가장 위쪽에서 include 하도록 해 주면 된다. 
혹은 precompiled header 가 잘못 세팅되어 찾지 못하는 문제일수도 있다. precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다. 



에러 : fatal error C1853: "Debug/test.pch" is not a precompiled header file created with this compiler


해결방안 :  현재 소스 코드에서 사용할 수 있는 pch 와 버전이 맞지 않는다는 의미. 
precompiled header 를 사용 안함으로 체크하여 pch 를 현재 소스 코드에 맞게 재 생성을 해 준다. 

참고로, precompiled header 를 사용 안함으로 체크할 경우 매번 전체 헤더파일을 재빌드 하므로, 아래와 같이 "미리 컴파일된 헤더 만들기"를 선택하여 최초에 한번 pch 를 만들어 주면, 그 다음부터는 precompiled header 사용하기를 선택하여 사용할 수 있다. 



질문 3 ) 그렇다면 stdafx.h 에 어떤 내용을 넣으면 되나요 

앞서 말했듯이 stdafx.h 는 한번만 미리 빌드해 놓고 그 다음부터는 재빌드 안하고 쓰는 모듈들이 되야 하므로, precompiled header 인 stdafx.h 에는 프로젝트 진행 중에 거의 값이 바뀌지 않는 외부 라이브러리나 전역 변수 등의 내용을 포함시키면 된다. 이들을 pch 로 만들어 놓고 빌드하면 매번 재빌드 하지 않고 컴파일 시간을 많이 줄일 수 있다

참고로, GCC ( .gch ) ,  C++ Builder ( vcl.h ) 등에서도 precompiled header 를 지원한다. 



참고 : Wikipedia - Precompiled header 

precompiled header 를 씁시다 (제발)

출처 : http://soyoja.com/372

참고 :

http://ssidang.tistory.com/tag/PCH

http://klayman.tistory.com/tag/PCH

저작자 표시 비영리 변경 금지
http://skmagic.tistory.com/trackback/293 관련글 쓰기


티스토리 툴바