본문 바로가기

C / C++ / Win32 / MFC

프로젝트 폴더 구조

본 포스트는 2006/8/8 작성되었습니다.

Visual Studio 에서 프로젝트를 생성하면 빌드의 Output 폴더가 기본적으로 프로젝트가 위치한 폴더에서 Release / Debug 폴더 등으로 세팅됩니다.

소스 아웃소싱을 주로 작업하고 있는 우리 팀에서는 작업된 소스를 수시로 고객사에 메일이나 메신저, FTP 등으로 보내는 일이 허다합니다. 그 때마다 obj 파일들 때문에 압축시간도 길어지고 압축파일 크기도 무시못할 정도로 커지고 해서 obj 파일들과 쓸데없는 파일들을 다 지우고 소스와 실행모듈만 압축해서 보내곤 했습니다. 그러다 보니 메인 실행 파일 외에 관련 DLL 이나 LIB 등의 프로젝트 소스가 많을 경우 해당 폴더로 가서 obj 와 쓸데없는 파일들을 지우기가 아주 귀찮았습니다.

그래서 우리 팀은 나름대로의 표준화된 폴더구조를 사용하고 있습니다. 이 글을 읽고 계신 개발자 여러분들도 나름대로의 구조로 사용하고 있으리라 생각됩니다만, 혹시라도 Visual Studio 에서 제공하는 기본적인 구조로 사용하시는 분에게 조금이라도 도움이 되지 않을까 하는 생각에 우리 팀의 방법을 소개해 봅니다.

 

우리는 하나의 프로젝트에 대해 다음과 같은 폴더를 생성합니다.

 

bin        : 실행모듈(exe, dll, ocx)과 실행시 필요한 파일들을 위치 시킵니다.

doc       : 개발기획서나 기능명세서, 메뉴얼, 외부 협의 문서 등과 같은 문서들을 저장합니다.

include  : 소스가 없는 외부 라이브러리를 이용할 경우 해당 해더 파일들을 위치 시킵니다.

lib         : 외부 라이브러리나 프로젝트 빌드로 나온 lib를 위치시킵니다.

obj        : obj 파일들을 위치시킵니다.

setup    : InstallShield 파일들을 위치시킵니다.

src       : 소스 파일들을 위치시킵니다.

research : 기초 자료 연구나 임시테스트용으로 작성된 소스를 위치시킵니다.

 

위에서 중요한 사실은 src에서 빌드되는 모든 obj 파일들과 Visual Studio 내부적으로 쓰이는 모든 파일들은 obj 폴더에 위치한다는 것입니다. 또한 exe, dll, ocx 와 같은 실행모듈은 bin 폴더로 위치하며, lib 파일들은 lib 폴더로 위치합니다. research의 소스들은 임시적이기 때문에 Visual Studio에서 제공하는 기본구조로 그냥 놔둡니다.

 

그러면 MyApp 라는 이름으로 프로젝트 소스 폴더가 어떠한 구조를 가지는지 시물레이션 해보겠습니다.

솔루션 이름과 메인프로젝트 이름을 MyApp 라 가정하고 SubDLL 이라는 dll 프로젝트를 하나 가지며 CxImage라는 외부라이브러리를 이용한다고 가정하겠습니다.

 

1. 먼저 프로젝트 Root 폴더를 만들고 그 안에 src 폴더를 만듭니다

2, src 폴더에서 MyApp 라는 이름으로 빈솔루션 파일을 생성합니다.

3. src 폴더 아래에 MyApp와 SubDLL 폴더를 각각 만들고 그 안에 프로젝트 파일들과 소스 파일들을 복사합니다. (또는 생성합니다.)

4. MyApp 솔루션에 MyApp와 SubDLL 프로젝트를 추가합니다.

5. 추가된 각 프로젝트 속성에 대해 각 Build Configuaration(Debug/Release) Output Directory와 Intermediate Directory를 ../../obj/MyApp(또는SubDLL)/Release(또는Debug)로 변경합니다.

6. 각 프로젝트 속성에 대해 각 Build Configuaration(Debug/Release) 의 Linker Output Directory를 ../../bin/MyApp.exe(또는SubDLL.dll)로 병경합니다.

7. SubDLL 프로젝트 속성에서 링커의 Import Library를 ../../lib/SubDLL.lib로 변경합니다.

8. CxImage 라이브러리의 헤더 파일들을 include/CxImage 폴더로 복사하고 lib 파일을 lib 파일로 복사합니다.

9. MyAPP 프로젝트 세팅에서 필요한 라이브러리 (,,/,,/lib/ximage.lib, ../../lib/SubDLL.lib)를 추가합니다.

 

이렇게 하고 빌드를 하게 되면 다음과 같은 폴더 구조가 생성됩니다.

 

폴더명(서브폴더)        파일 목록

--------------------------------------------------------------------

bin

                                MyApp.exe

                                SubDLL.dll

include

   CxImage                 CxImage 라이브러리 헤더 파일들...

lib                             SubDLL.lib

                                 xImage.lib

obj

   MyApp

      Debug                  MyApp의 Debug 용 obj 파일들과 그 외...

      Release               MyApp의 Release 용 obj 파일들과 그 외...

   SubDLL

      Debug                  SubDLL의 Debug 용 obj 파일들과 그 외...

      Release               SubDLL의 Release 용 obj 파일들과 그 외...

src                            MyApp.sln

   MyApp                    MyApp.vcproj 파일과 소스들...

   SubDLL                   SubDLL.vcproj 파일과 소스들...

 

 

위의 과정들을 자동화해주는 Visual Studio 2003 이상 버전에서 실행할 수 있는 매크로 화일을 첨부합니다. 2년여전에 만들어서 잘 사용하고는 있는데 VS6.0에서 업그레이드 된 프로젝트에 대해

간혹 안되는 경우가 있더군요.

본 매크로 파일은 현재 활성화된 프로젝트(솔루션이 아님) 세팅을 위의 과정대로 변경합니다.

솔루션의 전체 프로젝트에 대해 매크로를 실행 하려면 활성 프로잭트를 변경해가면서

각각 실행해야 합니다.

한가지 주의할 사항은 실행모듈이나 lib 파일일 경우 Build Configuration에 관계없이  같은 파일로

overwrite 되기 때문에 필요할 경우 Build Configuration 따라 다른 이름을 지정하시기 바랍니다.

저 같은 경우 SubDLL 에 대해 Debug 모드일 경우 ../../lib/SubDLLD.lib로 수정합니다.

 

이와 같은 폴더 구조로 하면 obj 폴더와 research 폴더만 제외하고 압축을 하면 훨씬 빠른 속도로 소스백엽도 가능하다는 잇점이 있습니다.