C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[428] [팁] PreCompile (프리컴파일) 로 컴파일 및 빌드 빠르게 하기
유광희 [yurchi] 11503 읽음    2004-04-14 15:41
안녕하세요

유광희 입니다. 빌더에서 제공하는 프리컴파일 기능을
제대로 쓰는 방법을 알려드립니다

대형 프로젝트를 제작할때 컴파일 시간이 꽤 걸리는데, 나름대로 #pragma hdrstop 을
쓴다고 썼지만, 한 소스 파일을 컴파일 및 빌드를 할때 이상하게 라인수가 10만이 넘어가고 그렇죠?
매번 파일마다 이런 현상이 생기니, 속도도 느리고, 여러 글을 보면 10분이 걸렸네 뭐 이렇습니다..
물론 하드웨어 사양도 있겠지만, 우선 하드웨어 사양을 따지기 전에 아래처럼 프리컴파일을
제대로 처리한 후에 사양을 따지도록 하죠..
믿거나 말거나 아래 처럼 해보세요. 확실히 달리진걸 느끼시게 됩니다. 특히 대형 프로젝트 ^^

프리컴파일을 쓰는 방법입니다.

1. 우선 프로젝트에 Preheader.cpp, Preheader.h 를 생성합니다. File->New->Unit 에서 우선 생성후 나중에 저 이름으로 저장

PreHeader.cpp
=============================================================================

//---------------------------------------------------------------------------
#include "PreHeader.h"
//---------------------------------------------------------------------------

PreHeader.h
=============================================================================

#ifndef PreHeaderH

#include <time.h>
#include <assert.h>
#include <vcl.h>
#include <inifiles.hpp>
#include <dir.h>
#include <stdio.h>
#include <string.h>
#include <systdate.h>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <jpeg.hpp>
#include <ComCtrls.hpp>
#include <ImgList.hpp>
#include <Registry.hpp>
#include <ActnList.hpp>
#include <scktcomp.hpp>
#include <Dialogs.hpp>
#include <NMHttp.hpp>
#include <NMURL.hpp>
#include <Psock.hpp>

#include <memory>

#include "define.h"
#include "Common.h"

#pragma hdrstop

#define PreHeaderH
//---------------------------------------------------------------------------
#endif


설명 : 위의 include 선언은 예시 입니다. PreHeader.h 에 폼이던 뭐든 한번 이상 중복되게 선언, 또는 쓰일것 같은, 변화되지 않는 해더 파일을 모조리 다 PreHeader.h 에 포함합니다

2. 각각의 프로젝트의 모든 폼, 유닛(.cpp) 의 첫 라인을 처리합니다.

기존:
#include <vcl.h>
#include <inifiles.hpp>
#pragma hdrstop
#include "TfrmMain.h"
#include "abcd.h"

이렇게:
#include "PreHeader.h"
#include 'TfrmMain.h"
#include "abcd.h"

3. PreHeader 유닛 파일(PreHeader.cpp) 을 프로젝트 메니저의 맨 위로 옮겨줍니다

4. CTRL+SHIFT+F11 -> Compiler -> Precompile headers 에서
4-1 FileName 을 $(BCB)\lib\XXXXX.csm 처럼 바꿉니다. XXXXX 는 프로젝트 이름입니다
4-2 Use pre-compiled headers 를 선택

5. 컴파일 또는 빌드
컴파일시 PreHeader.cpp 의 경우 10만 라인까지 넘어가 느려지나, 이 파일을 넘기면,
그 이외 파일들은 1~3초만에 모두 다 컴파일이 됩니다. 간혹 만라인이 넘는다.. 그럴경우에는 그 cpp 중간에 include 가 들어가 있을 수 있어서 그럴수 있습니다. 그런것도 vcl 쪽 헤더라면 preheader.h 로 빼주세요.

달리진걸 느끼셨나요? 이전에는 #pragma hdrstop 으로 했는데두 몇만라인 까지 갔던게, 이제 모두 싹 사라졌죠? 10분 걸렸다면 2~3분만에 올 빌드가 끝날 겁니다.

혹시 의문점이 있지 않나요? 폼에 보면 헤더 파일에 폼에서 썼던 파일들이 자동으로 include 선언되어 있죠?
이런것도 말끔히 위 preheader.h 에 넣음으로서 이젠 무쟈게 빨라집니다. 아니 아예 헤더를 읽지 않았나? 라는 생각이 들 정도예요

다음 번에는 속도 향상을 위해서 class 로 된 녀석을 include 하여 선언할때 속도를 줄일 수 있는
방법을 적어볼께요

그럼 이만

http://www.cpueblo.com






수야!╋ [sooya23]   2004-04-14 16:04 X
해보진 않았지만 -_-; 굿! -    _ - 乃
유광희 [yurchi]   2004-04-14 16:52 X
꼭 해보세요. 한줄 고치고 컴파일 하는데 0.5초 이상이 걸리지 않습니다 ^^
폼이 복잡하고 뭐고 간에 MFC 쪽 컴파일 하는 속도랑 차이가 나지 않습니다.
느렸다는 빌더가 새롭게 보이길 바라며~
마이키 [kes0103]   2004-04-17 11:29 X
초보같은 질문이지 모르겠는데요
3번에서 유닛파일은 어떻게 프로젝트 매니져의 처음으로 올릴수 있나요?
참고로 BCB5.0 입니다.
yypbd [yypbd]   2004-04-21 11:12 X
프로젝트 매니저에서 프로젝트 파일 위에서 마우스 오른쪽 클릭하구 View Source하심됩니다. 아님 걍 bpr파일을 Text Editor로 여셔두 되구요
yypbd [yypbd]   2004-04-21 11:13 X
잘됩니다. 20분 걸리던게 4분 걸리네요
강재호.만해 [greenuri]   2004-04-23 20:09 X
허걱~ 5~10 분 걸리던 컴파일이 1분도 안 되서 끝이 났어요 ㅋㅋㅋ 좋은 방법 갈켜 주셔서 감사 합니다.
심호용 [yourmate73]   2004-05-13 10:23 X
Pre Compiled header를 사용하면 어떤점에서 빨라진다는 건지.......
예를들어 a.h를 전모듈에서 거의 참조한다고 가정했을때, a.cpp의 내용을 수정한후 다시 빌드했을때 속도도 줄일수 있다는 얘긴지.......
김태선 [jsdkts]   2004-06-04 19:35 X
정말 좋은 정보네요.
컴파일 시간 때문에 클래스 설계까지 컴파일 시간을 줄이는 방향으로 개선을 했었는데..
이제 안 그래도 되겠군요.
총 컴파일 라인이 백만 라인을 넘어가니 좀 시간에 신경이 쓰이더군요.
고정적인 헤더만이라도 컴파일 시간에서 제외시킬수 있다니 정말 좋군요.
왕다솜 [dasom]   2004-06-07 18:00 X
아마 클래스로 사용하다 보면 헤드파일에 인클루드 해야 할 경우가 생길겁니다. 그럴 경우 헤드파일에 전방참조(예. clsss TCombo)하시고 cpp에 인클루드를 포함시키면 됩니다. 프리컴파일 목적은 동일한 헤드를 여느 시간을 줄이기 위해서 사용한다고 그러더군요. ... 님 글 잘 읽었습니다...
김태선 [jsdkts]   2004-08-13 11:49 X
위 방법은 VC++에서는 stdafx.h stdafx.cpp 를 통해서 구현하고 있는 방법과 같습니다.
VC++로 큰 프로젝트를 컴파일해봐도 무척 빠른 것에 놀라게 되는데, 비법은 이것이었습니다.
VC++에서는 컴파일 시간 때문에 위와 같은 소스 구성을 표준으로 하는 것으로 보입니다.
구성을 독특하게 하지 않은 이상, 실제로 컴파일 시간은 거의 신경이 안쓰일 정도닌까요...
김상윤 [seiyes]   2004-09-10 15:03 X
정말 좋은 방법 감사합니다...근데..혹시 exe로 배포할때 파일 크기가 커질수도 있는건가요...ㅡㅡ??
아니면 다른 단점을 찝으라면 어떤게 있을까요?? ㅡ.ㅡ;;
(딴지아님.....단점이 없다면 애시당초이렇게 만들어서 나오지..^^)
김태선 [jsdkts]   2004-09-23 13:38 X
exe 실행화일 크기와는 무관한 방법입니다.
단점은 하수는 힘들다는 거지요. --;
애시당초 그렇게 안한 것은, RAD툴 특성을 하수들도 신경쓰지 않게 적용하기 위해서입니다.

천승환 [kalbaram]   2004-11-09 15:13 X
전 왜 차이가 없는거죠?..ㅠ_ㅠ;..

PreHeader하는데 대략 40만 라인정도 걸렸는데..
다른 화일도 하는데 대부분 그정도 나와요..

프리컴파일이 안된다는건뎅... 아..왜 안되는지..쩝쩝,..

기존에 있던 화일의 #include 부분을 PreHeader.h에 다 옮기고..삭제시켰는데..
저장하면 바로 다시 생기네요..
이게 문제인가요?..원래 정상인가요?..음..

김태선 [jsdkts]   2004-11-09 15:36 X
헤더를 모두 PreHeader.h 로 옮기지 마세요.
프로젝트에서 만든 헤더는 포함하지 마세요.
그래야 컴파일 속도가  눈부시게 빨라집니다.
김성협 [sunghyup]   2005-04-29 14:47 X
저도 효과가 없었다는.. 20분 넘게걸리던게 그대로입니다.
눈부시게는 바라지도 않는데.. 30%만 빨라져도 소원이 없겠네요.
몇 번을 다시보고 해봤는데 소용없네요.. 반나절이나 걸려서 시도한건뎅.. ㅠ.ㅠ
김성협 [sunghyup]   2005-04-30 10:46 X
해결했습니다. 계속 Warnning 이 떴었는데..
하나는 <TeEngine.hpp> 땜시 프리컴파일 해더를 생성할 수 없다는 메시지였는데
해더에서 제거하니 사라졌고.
또 하나는 <Math.hpp>때문에 프리컴파일 해더를 생성할 수 없다는 메시지였습니다.
PreHeader.h 에는 <Math.hpp> 가 없어서 하나씩 빼보았습니다.
하나씩 빼보니... <DateUtils.hpp> 에서 나온거더군요.
아마도 DateUtils.hpp에서 Math.hpp를 include한 모양입니다.

태선님 말대로 각폼의 해더에 자동생성되는 *.hpp는 PreHeader.h에서 제거하는게
맞는것 같습니다.

제 PreHeader.h는 이렇습니다. 모두 성공하세요~
//---------------------------------------------------------------------------
#ifndef PreHeaderH

#include <Registry.hpp>
#include <System.hpp>
#include <SysUtils.hpp>
#include <Windows.hpp>


#include <algorithm>
#include <fstream>
#include <iostream>
#include <math.h>
#include <map>
#include <stdio.h>
#include <sysdefs.h>
#include <time.h>
#include <vcl.h>
#include <vector>
#include <windows.h>

#pragma hdrstop

#define PreHeaderH
//---------------------------------------------------------------------------
#endif
땅주인 [heaven2]   2008-03-04 13:13 X
땡큐~ 땡큐~ 땡큐~ ....
Include 꼬여서 엄한데서 에러 났었는데..
이참에 Precompile하자 했더니..한 방에 해결..
땡큐 땡큐..땡큐..땡큐.. .... 넘 땡큐~~~~~~

+ -

관련 글 리스트
428 [팁] PreCompile (프리컴파일) 로 컴파일 및 빌드 빠르게 하기 유광희 11503 2004/04/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.