본문 바로가기
C,C++

미리 컴파일 된 헤더 사용하기

by woohyeon 2023. 10. 7.
반응형

개념

미리 컴파일 된 헤더를 사용하면 빌드 수행 시 걸리는 컴파일 시간을 줄일 수 있다.

C/C++ 언어로 작성된 코드는 컴파일과 링크 과정을 통해 실행 가능한 프로그램으로 만들어진다.
헤더 파일은 소스 파일에 인클루드되고 컴파일은 소스 파일 단위로 수행된다. 만약 어떤 헤더를 포함하는 소스 파일이 수정되면 그 소스 파일은 다시 컴파일해야 한다. (헤더는 변하지 않았음에도)

헤더가 많은 내용을 담고 있다면 컴파일 하는 데 걸리는 시간은 낭비이다. 만약 헤더의 내용이 변경되지 않았을 경우 그냥 변경된 소스 부분만 컴파일할 수 있다면 좋을텐데, 이를 미리 컴파일 된 헤더가 가능하게 해준다.

 

대략적인 원리

어떤 헤더를 하나 정하고, 그 헤더에 여러 내용을 작성한다. 이 헤더에 작성된 내용과 이 헤더가 포함하고 있는 내용들을 미리 컴파일 해둔다. 이 결과는 .pch라는 확장자를 가진 파일 형태로 존재하게 된다. 프로젝트 빌드 시 각 소스 파일을 컴파일할텐데, 이 때 3개의 소스 파일이 이 헤더를 참조한다고 가정하면 원래라면 이 헤더는 세 번 컴파일 되어야 한다. 하지만 우리는 미리 컴파일 해둔 .pch 파일이 있기에 이를 활용하게 되고 이 헤더 내용을 제외한 부분만 컴파일하게 된다. pch 파일은 빌드 시 프로젝트 폴더 내에 .obj 파일이 모여 있는 곳에 함께 생성된다.

 

미리 컴파일 된 헤더 시스템 사용하기

다른 개발 환경에서 사용할 수 있을진 모르겠지만, Visual studio 기준으로 이를 사용하려면 두 가지 설정이 필요하다.

1. pch 파일을 생성하도록
2. pch 파일을 사용하도록

그리고 미리 컴파일할 헤더를 정해야 하는데 관례적으로 이름은 stdafx이다. (다른 이름이어도 되지만 여기선 관례를 따른다)
프로젝트를 만들 경우 함께 만들어질 수도 있는데, 그렇지 않은 경우 직접 stdafx.h, cpp를 만들어 주어야 한다.

cpp는 stdafx.h를 include 해야 하며, 그 외엔 원하는 내용을 작성한다. 여기에 작성 되는 내용은 보통 자주 변경되지 않는 내용이며, <vector>와 같은 헤더를 include할 수도 있다.

우선 pch 파일을 생성하도록 하기 위해
stdafx.cpp 우클릭 후 Properties  - C/C++ - Precompiled Headers에서 아래와 같이 설정해준다.

 

그 다음은 pch 파일을 사용하도록 프로젝트 속성에서 다음과 같이 설정해준다.

위 속성은 소스 파일마다 설정이 가능한데, 프로젝트 속성을 위와 같이 변경하면 해당 프로젝트 내의 모든 소스 파일에 적용된다. pch 파일을 사용하도록 설정된 소스 파일들은 모두 stdafx.h 헤더를 인클루드 해야 한다. 그렇지 않으면 다음과 같은 에러가 발생하며, 해당 에러를 더블 클릭하면 인클루드 하지 않은 소스파일로 이동한다.

 

stdafx.h를 인클루드하고 싶지 않은 경우 해당 소스 파일의 속성에서 위 미리 컴파일된 헤더 사용을 하지 않도록 변경하면 된다.




댓글