::: IT인터넷 :::

Visual C++ 프로젝트 폴더 구성하기

곰탱이푸우 2021. 7. 23. 08:20

NAS에 개발 환경을 구축하면서 약 7년 전에 MFC 공부하면서 만들었던 MD5를 추출하는 GUI 툴을 테스트 프로젝트로 활용했다.

  • Visual Studio 2008의 Visual C++과 MFC를 사용해서 만들었다.
  • Visual Studio Express 2010 (Visual C++ 2010)은 MFC가 포함되어 있지 않아 빌드에서 오류가 발생한다.
    (MFC 관련 SDK를 추가로 설치하면 사용 가능하다.)
  • Visual Studio Community 2019는 MFC가 포함되어 있어서, MFC를 추가 설치하면 빌드가 가능하다.

 

최근엔  GUI 관련 개발도 Qt 또는 PyQt 같은 더 쉬운 방법 있어 MFC를 사용하는 경우는 많지 않은 것 같다.

NAS에 구축한 GitLab과 Nexus에 해당 프로젝트를 직접 적용해보면서 확인한 Visual C++ 프로젝트 관련 내용을 정리한다.

 

Visual C++ 프로젝트 구조

Visual Studio는 일반적으로 솔루션(.sln) 단위로 구성되며, 솔루션은 다수의 프로젝트를 포함한다.

각 프로젝트들은 EXE나 DLL 파일을 생성하며, 다수의 프로젝트를 구성하여 상호 참조를 통한 대형 프로그램도 작성 가능하다.

 

본 포스팅은 MFC 개발 관련 내용은 아니므로 MFC와 Visual Studio에 대한 전반적인 내용은 다음 도서를 참고한다.

 

쉽게 배우는 MFC 윈도우 프로그래밍 - YES24

꼭 필요한 이론과 실습으로 쉽게 배우는 MFC 윈도우 프로그래밍C++ 언어를 배운 후, 윈도우 프로그래밍을 처음 시작하는 독자를 위한 책이다. MFC 프로그래밍을 시작 → 기초 → 고급 → 실전 프로

www.yes24.com

 

Visual C++ 2008 MFC 윈도우 프로그래밍 - YES24

최신 컴파일러 사용 환경과 프로그래밍 기법을 담은 간결한 내용의 윈도우 프로그래밍 입문서로 윈도우 프로그래밍은 어렵다는 잘못된 선입견을 깨고 있는 책이다. 가장 중요한 기획 의도는 입

www.yes24.com

 

 

Visual Studio에서 MFC 프로젝트를 생성하면 다음과 같은 구조로 되어 있다.

root - 솔루션의 최상위 폴더
    \프로젝트명 - 각 프로젝트 공통 구성 파일 (프로젝트 설정, 기본 .cpp, .h 파일)
        \Debug - 프로젝트의 디버그 빌드로 생성 된 obj 파일
        \Release - 프로젝트의 릴리즈 빌드로 생성 된 obj 파일
    \Debug - 솔루션의 디버그 빌드 결과물이 저장되는 경로
    \Release - 솔루션의 릴리즈 빌드 결과물이 저장되는 경로

 

프로젝트 구성 파일과 개발한 코드, 빌드 산출물들이 섞여 버리는데, 체계적인 관리를 위해서 별도의 구조로 정리할 필요가 있다.

물론 아주 단순한 형태이거나 공부 목적이라면  그대로 두는 것도 나쁘지 않다.

 

형상 관리를 위한 코드 관리 구조는 조직, 프로젝트, 사람 별로 다르기 때문에 정답은 없다.

그러나 대학원 재학 시절 참여했던 프로젝트와 다른 자료들을 참고하면 보편적으로 사용하는 구조는 존재한다.

 

과거 경험과 참고한 자료를 바탕으로 정리한 일반적인 구조는 다음과 같다.

root - 솔루션의 최상위 폴더
    \Bin - 빌드 결과물이 저장되는 경로, 결과물 실행시 필요한 파일 (.exe, .dll, 재배포 패키지 등)
    \Build - 각 프로젝트 공통 구성 파일 (프로젝트 설정, 기본 .cpp, .h 파일)
        \ExExe - ExExe 프로젝트 폴더
        \ExDLL - ExDLL 프로젝트 폴더
    \Doc - 개발 관련 문서 (원페이저, SRS, SDS, 매뉴얼, 테스트, 참고 문서 등)
    \Include - 각 프로젝트에서 직접 작성했거나 외부 라이브러리의 헤더 파일 (.h)
        \ExExe - ExExe 프로젝트 폴더
        \ExDLL - ExDLL 프로젝트 폴더
        \ExLibrary - 외부 라이브러리 폴더
    \Lib - 외부 라이브러리나 프로젝트 빌드로 생성 된 lib 파일
        \ExExe - ExExe 프로젝트 폴더
        \ExDLL - ExDLL 프로젝트 폴더
        \ExLibrary - 외부 라이브러리 폴더
    \Obj - 프로젝트 빌드로 생성 된 obj 파일과 빌드 산출물
        \ExExe - ExExe 프로젝트 폴더
            \Debug - ExExe 디버그 빌드
            \Release - ExExe 릴리즈 빌드
        \ExDLL - ExDLL 프로젝트 폴더
            \Debug - ExDLL 디버그 빌드
            \Release - ExDLL 릴리즈 빌드
    \Src - 소스 파일 (.c, .cpp 등)
        \ExExe - ExExe 프로젝트 폴더
        \ExDLL - ExDLL 프로젝트 폴더
        \ExLibrary - 외부 라이브러리 폴더

 

자세한 설명은 다음 포스팅을 참고한다.

 

프로젝트 폴더 구조

본 포스트는 2006/8/8 작성되었습니다. Visual Studio 에서 프로젝트를 생성하면 빌드의 Output 폴더가 기본적으로 프로젝트가 위치한 폴더에서 Release / Debug 폴더 등으로 세팅됩니다. 소스 아웃소싱을

wodev.tistory.com

 

 

GitLab과 Nexus 테스트에 사용한 MD5 추출 GUI 도구는 EXE 파일 한 개를 생성하는 단일 프로젝트로 구성되어 있다.

MD5Viewer-win32 - 솔루션의 최상위 폴더
    \Bin - 빌드 최종 산출물인 MD5Viewer.exe (릴리즈 모드), MD5Viewerd.exe (디버그 모드) 저장 경로
    \Build
        \MD5Viewer - MD5Viewer 프로젝트 공통 구성 파일 (프로젝트 설정, 기본 .cpp, .h 파일)
    \Doc - 개발 관련 문서 (Confluence 같은 웹 기반 Wiki 사이트로 대체)
    \Include
        \MD5Viewer - MD5Viewer 관련 헤더 파일 (MD5ViewerDlg.h, MD5ViewerDoc.h)
        \Hash - MD5 해시 생성 코드의 헤더 파일 (md5.h)
    \Obj
        \MD5Viewer
            \Debug - MD5Viewer 디버그 빌드로 생성 된 obj 파일과 빌드 산출물
            \Release - MD5Viewer 릴리즈 빌드로 생성 된 obj 파일과 빌드 산출물
    \Src
        \MD5Viewer - MD5Viewer 프로젝트 소스 파일 (MD5ViewerDlg.cpp, MD5ViewerDoc.cpp)
        \Hash - MD5 해시 생성 소스 코드 (md5.c, md5driver.c)

 

프로젝트를 생성했을때 Visual Studio가 생성해주는 공통 파일들은 Build 폴더 하위에 위치한다.

이후 개발 과정을 통해 작성한 코드들은 Include, Src 폴더에 위치한다.

  • Include - 작성한 코드 중 헤더 파일만 위치
  • Src - 작성한 코드 중 소스 파일만 위치

 

빌드하여 생성 된 파일들은 Bin, Obj 폴더에 위치한다.

  • Bin - 빌드를 통해 생성 된 최종 산출물
  • Obj - 빌드 과정 중 생성되는 모든 파일

 

이렇게 관리하면 GitLab에 코드를 Commit 할때 불필요한 파일들을 제거하기 편하다.

 

 

Visual Studio 프로젝트 관련 파일

Visual Studio에서 프로젝트를 생성하면 기본적으로 생성되는 파일들이 있다.

대표적인 확장명들의 역할은 다음과 같다.

  • sln - 솔루션이 관리하는 여러 프로젝트에 대한 정보 포함. VS의 2008, 2010, 2019 버전은 호환되지 않아 변환 필요
  • suo - 작업 내용, 솔루션 관련 설정 변경 내역 등 저장 (사용자 작업 로그 파일)
  • user - 사용자별 환경 설정 내용 저장
  • vcxproj (또는 vcproj) - C++ 프로젝트 구성 정보 저장 (소스코드, 헤더 파일, 컴파일과 링크 설정 정보 등)
  • ipch 폴더 - 컴파일때 생성되는 다양한 파일 저장
  • ncb - Visual Studio 2008에서 빌드시 생성되는 데이터베이스 파일
  • sdf - Visual Studio 2010에서 빌드시 생성되는 데이터베이스 파일
  • filters - Visual Studio 2010 이상 버전에서 프로젝트에 포함하는 파일 목록 저장

 

소스 코드를 Commit 할 때 제거해야 하는 파일과 폴더는 다음과 같다.

  • .ncb (VS2008), .sdf (VS2010 이후) - 가장 큰 용량을 차지하며, 빌드할 때마다 생성 된다.
  • Debug/Release - 솔루션과 프로젝트 폴더에 생성되며, 빌드할 때마다 생성 된다.
  • .user - 해당 프로젝트를 작업하는 PC마다 생성된다.
  • .suo - 작업 내역이 기록 된 로그 파일은 필요하지 않다.
  • ipch 폴더 - 빌드할 때마다 생성 된다.

 

자세한 내용은 아래 포스팅을 참고한다.

 

비주얼스튜디오 프로젝트 파일 설명(sln, suo, user, vcproj, ncb, sdf)

비주얼스튜디오 프로젝트 파일 설명(sln, suo, user, vcproj, ncb, sdf) 프로젝트 파일들이 하는 역할 솔루션과 프로젝트를 생성하면 자동으로 생기는 몇몇 파일들에 대한 설명을 기록합니다. sln : 텍스

codingcoding.tistory.com

 

 

Visual C++ 프로젝트 구조 변경하기

아래 과정을 진행하기 전에 Commit 할때 제거해야 하는 파일들은 미리 삭제한다.

 

Build 폴더 설정

Build 폴더 하위에 프로젝트명으로 폴더를 생성하고 프로젝트 공통 설정 파일을 옮긴다.

테스트 프로젝트의 경우 SolutionDir\Build\MD5Viewer이다.

 

이후 Visual Studio에서 해당 솔루션을 다시 열면 프로젝트 정보를 읽을 수 없다고 나온다.

 

우측의 솔루션 탐색기에서 기존 프로젝트를 우클릭하고 제거(V)를 클릭한다.

 

솔루션 부분을 우클릭하고 추가(D) - 기존 프로젝트(E)를 클릭한다.

프로젝트 구성 파일이 위치하는 폴더로 이동하고 .vcxproj 파일을 선택한다.

 

 

Src 폴더 설정

Src 폴더 하위에 프로젝트명으로 폴더를 생성하고 소스코드 파일인 .c와 .cpp 파일을 옮긴다.

  • 코드를 작성한 MD5ViewerDlg.cpp와 MD5ViewerDoc.cpp 파일이 해당한다.
  • 코드 수정을 하지 않은 MD5Viewer.cpp는 Build\MD5Viewer 폴더에 유지한다.

 

Src 폴더 하위에 Hash 폴더를 생성하고 MD5 생성 코드를 옮긴다.

  • 해시를 생성하는 md5.c와 md5driver.c 파일이 해당한다.
  • 직접 작성하지 않은 외부 코드이므로 별도의 폴더를 생성했다.

 

Visual Studio에서 해당 프로젝트를 열면 파일을 찾을 수 없다고 나온다.

프로젝트 설정 방법과 동일하게 진행한다.

 

읽지 못하는 .c, .cpp 파일을 선택하고 우클릭하여 제거(V)를 클릭한다.

 

소스 파일 부분을 우클릭하고 추가(D) - 기존 항목(G)를 클릭한다.

추가할 소스 코드 (.c, .cpp) 파일이 위치한 곳으로 이동하고 파일을 추가한다.

 

 

Include 폴더 설정

Include 폴더 하위에 프로젝트명으로 폴더를 생성하고 헤더 파일인 .h 파일을 옮긴다.

  • 코드를 작성한 MD5ViewerDlg.h와 MD5ViewerDoc.h파일이 해당한다.
  • 코드 수정을 하지 않은 MD5Viewer.h는 Build\MD5Viewer 폴더에 유지한다.

 

Include 폴더 하위에 Hash 폴더를 생성하고 MD5 생성 코드의 헤더 파일을 옮긴다.

  • 해시를 생성하는 md5.h 파일이 해당한다.
  • 직접 작성하지 않은 외부 코드이므로 별도의 폴더를 생성했다.

 

Visual Studio에서 해당 프로젝트를 열면 파일을 찾을 수 없다고 나온다.

프로젝트 설정 방법과 동일하게 진행한다.

 

읽지 못하는 .h 파일을 선택하고 우클릭하여 제거(V)를 클릭한다.

 

헤더 파일 부분을 우클릭하고 추가(D) - 기존 항목(G)를 클릭한다.

추가할 헤더 (.h) 파일이 위치한 곳으로 이동하고 파일을 추가한다.

 

프로젝트 설정에서 헤더 파일이 위치하는 폴더 경로를 지정하지 않으면 헤더 파일을 인식하지 못한다.

 

상단의 프로젝트(P) - 속성(P) 메뉴로 이동한다.

C/C++ 탭의 일반을 클릭하고 '추가 포함 디렉터리' 부분에 생성한 헤더 파일 폴더를 입력한다.

 

Visual Studio의 매크로를 사용하면 쉽게 입력할 수 있다.

  • $(SolutionDir)\Include\$(ProjectName);
  • $(SolutionDir)\Include\Hash - Hash 폴더의 경우 정의 된 매크로가 없어서 직접 입력해야 한다.

 

Debug 모드와 Release 모드 모두 적용해야 하므로, 상단의 구성(C)의 Debug를 Release로 변경하고 동일하게 적용한다.

 

 

Obj 폴더 설정

빌드 과정 중 생성되는 파일들이 저장 될 폴더를 지정한다.

Obj 폴더 하위에 프로젝트명으로 폴더를 생성한다.

 

상단의 프로젝트(P) - 속성(P) 메뉴로 이동한다.

좌측 탭의 제일 위에 있는 일반을 클릭하고 '출력 디렉터리'와 '중간 디렉터리' 부분을 수정한다.

  • 출력 디렉터리 - $(SolutionDir)\Obj\$(ProjectName)\Debug\
  • 중간 디렉터리 - $(SolutionDir)\Obj\$(ProjectName)\Debug\

 

Debug 모드와 Release 모드 모두 적용해야 하므로, 상단의 구성(C)의 Debug를 Release로 변경하고 동일하게 적용한다.

Release 모드인 경우 '출력 디렉터리'와 '중간 디렉터리'의 Debug를 Release로 지정한다.

 

Bin 폴더 설정

최종 생성 될 exe 파일이 저장 될 경로를 지정한다.

 

상단의 프로젝트(P) - 속성(P) 메뉴로 이동한다.

링커 탭의 일반을 클릭하고 '출력 파일' 부분을 수정한다.

Debug 모드와 Release 모드 모두 적용해야 하므로, 상단의 구성(C)의 Debug를 Release로 변경하고 동일하게 적용한다.

  • Debug 모드 - $(SolutionDir)\Bin\$(ProjectName)d.exe
  • Release 모드 - $(SolutionDir)\Bin\$(ProjectName).exe

 

 

Debug 모드 생성 파일과 Release 모드 생성 파일을 구분하기 위해 Debug 모드 생성 파일명에 d를 추가했다.

 

 

Commit 할때 불필요한 파일을 제외하는 .gitignore

Commit 하기 전에 Visual Studio에서 제공하는 다음 기능을 활용하면 불필요한 파일은 제거 되지만 일부 파일은 남는다.

  • 빌드 - 솔루션 정리(C)
  • 빌드 - '프로젝트명' 정리(N)

 

정리하자면 빌드할 때마다 생성 되는 파일과 불필요한 파일들은 Commit 할때 제외해야 한다.

가장 좋은 방법은 .gitingore 파일을 생성하는 것이다. 특정 파일이나 폴더, 확장명 등을 지정하면 Commit에서 제외된다.

  • 프로젝트 폴더 구성을 변경하면 빌드하면서 생성되는 파일이 위치한 Obj, Bin 폴더
  • suo, user, ncb, sdf 파일
  • ipch 폴더

 

이를 위해 작성한 .gitignore는 다음과 같다.

*.ncb
*.suo
*.sdf
*.ipch
build/*/*.user
build/*/*.ipch
build/*/ipch/
.vs/
bin/
obj/

 

실제 Commit 된 파일들을 확인해보면 불필요한 파일들은 제외 된 것을 확인할 수 있다. 물론 빌드도 잘 된다.