개발을 진행하면 헤더(.h)와 소스 파일(.cpp)들을 필요에 따라 계속 만들게 되고, 폴더를 만들고 정리해두면 관리가 용이하고 보기에도 좋다. 사람마다 정리하는 방법이 다르겠지만 나는 아래와 같이 폴더 구조를 만든다.
/[프로젝트명] - 프로젝트 최상위 폴더/bin - 실행 파일
/obj - 빌드 중간 생성 파일
/include - 헤더 파일 (*.h)
/src - 소스 파일 (*.cpp)
/build/[프로젝트명] - *.vcxproj와 같은 프로젝트 설정 파일, 기본 생성되는 *.cpp 및 *.h
/res - 리소스 파일
*.sln - 솔루션 파일
현재 directx를 사용한 렌더링 엔진 및 해당 엔진을 사용한 모델 뷰어를 MFC로 개발하고 있다. 그래서 DLL 프로젝트 및 해당 DLL을 사용하는 MFC 프로젝트의 설정 방법을 예로 들어서 정리했다.
1. 폴더 생성 및 파일 이동
위에서 설명한 구조 또는 본인이 원하는 폴더 구조가 있다면 폴더들을 그에 맞게 생성한 후에 각 파일들을 옮겨준다.
2. 솔루션의 프로젝트 제거 및 추가 / 각 필터에서 항목들 모두 제거 후 다시 추가
프로젝트 설정 파일들의 위치를 변경하고 솔루션을 열면 경고창과 함께 프로젝트를 찾을 수 없다고 나오는데, 기존에 로드돼있던 프로젝트를 제거하고 솔루션 위에서 Add - Existing Project을 통해 옮긴 프로젝트 설정 파일을 새로 추가한다. 그리고 솔루션 익스플로러내 각 필터의 항목들은 프로젝트 파일에 위치가 기입돼있다. 폴더 구조를 새로 만들 것 이기 때문에, 해당 작업 이전에 모든 항목을 먼저 제거해야 한다. 제거하지 않으면 폴더 생성 후 이미 옮겨진 파일의 위치와는 다르게 계속 기존 위치를 가리키고 있어서 여러 에러가 발생한다. 프로젝트를 만들면 기본적으로 생성되는 필터들은 Header Files, Resource Files, Source Files가 있는데, 이 필터들과 본인이 추가적으로 만든 필터들이 있다면 그 필터들의 항목들도 두 프로젝트에서 모두 제거 시켜준 후 다시 추가해준다.
3. MFC 프로젝트 솔루션에 DLL 프로젝트 추가
MFC 프로젝트가 포함된 솔루션에 DLL 프로젝트를 추가한다. 솔루션 항목 위에서 마우스 우클릭 - Add - Existing Project로 추가할 수 있다.
4. 프로젝트 설정 변경
빌드 및 원활한 관리를 위해 각 프로젝트의 설정들을 모두 변경해야 한다. 공통적인 변경 사항에 대해 먼저 설명한다. 첫 번째로 프로젝트 속성을 열었을 때, 앞으로 변경할 내용들이 모든 모드에 적용될 수 있도록 All Configuration으로 바꾸는 것이다.
두 번째로 General에서 출력 파일과 중간 생성 파일들의 생성 경로를 설정해야 한다. 특히 출력 파일은 두 프로젝트 모두 동일하게 되도록 설정하는 것이 관리가 편하다. 다만, 경로 이름을 절대적으로 써넣는 것보다 VS에서 제공하는 매크로를 사용하는 것이 매우 유용하다.
세 번째로 C/C++ - General - Additional Include Directories에 폴더 구조에 따라 새로 변경된 헤더 파일들이 들어 있는 폴더 경로를 입력한다. 그리고 만약 솔루션을 빌드하게 된다면 두 프로젝트가 함께 빌드 되는데, MFC 프로젝트에서는 당연히 DLL 프로젝트의 헤더 파일들을 사용하게 됨에 따라 DLL 프로젝트의 헤더 파일 경로가 필요하다. 따라서 MFC 프로젝트 설정에는 DLL 프로젝트의 헤더 파일 경로를 별도로 넣어준다. 필요한 경우에는 리소스 파일을 위해 Resources - General - Additional Include Directories도 수정이 필요하다.
네 번째로 *.lib 파일을 위해서 Linker - General- Additional Library Directories를 입력한다. 두 번째 변경 사항에서 출력 파일 경로를 통일했다고 가정하면 추가 라이브러리 디렉토리는 출력 파일 경로와 동일하게 설정해주면 되고, 출력 파일 경로를 통일하지 않았다면 DLL 프로젝트의 출력 파일 경로와 동일하게 설정해주면 된다. 사용할 *.lib 파일 이름도 Linker - Input - Additional Dependencies에 넣어줄 수 있다. 이게 싫다면 헤더에 #pragma comment(lib, "*.lib")를 넣어줘도 된다.
두 번째로 General에서 출력 파일과 중간 생성 파일들의 생성 경로를 설정해야 한다. 특히 출력 파일은 두 프로젝트 모두 동일하게 되도록 설정하는 것이 관리가 편하다. 다만, 경로 이름을 절대적으로 써넣는 것보다 VS에서 제공하는 매크로를 사용하는 것이 매우 유용하다.
세 번째로 C/C++ - General - Additional Include Directories에 폴더 구조에 따라 새로 변경된 헤더 파일들이 들어 있는 폴더 경로를 입력한다. 그리고 만약 솔루션을 빌드하게 된다면 두 프로젝트가 함께 빌드 되는데, MFC 프로젝트에서는 당연히 DLL 프로젝트의 헤더 파일들을 사용하게 됨에 따라 DLL 프로젝트의 헤더 파일 경로가 필요하다. 따라서 MFC 프로젝트 설정에는 DLL 프로젝트의 헤더 파일 경로를 별도로 넣어준다. 필요한 경우에는 리소스 파일을 위해 Resources - General - Additional Include Directories도 수정이 필요하다.
네 번째로 *.lib 파일을 위해서 Linker - General- Additional Library Directories를 입력한다. 두 번째 변경 사항에서 출력 파일 경로를 통일했다고 가정하면 추가 라이브러리 디렉토리는 출력 파일 경로와 동일하게 설정해주면 되고, 출력 파일 경로를 통일하지 않았다면 DLL 프로젝트의 출력 파일 경로와 동일하게 설정해주면 된다. 사용할 *.lib 파일 이름도 Linker - Input - Additional Dependencies에 넣어줄 수 있다. 이게 싫다면 헤더에 #pragma comment(lib, "*.lib")를 넣어줘도 된다.
5. Project Dependencies 관련
DLL 프로젝트보다 MFC 프로젝트가 먼저 빌드되면 빌드 에러가 발생한다. Project - Project Dependencies에서 프로젝트 종속성 설정을 해야 한다.
* Precompiled Headers 관련
1 - 5 과정을 진행하면 아무런 에러 없이 빌드 및 실행이 잘 된다. 그러나 pch.h와 pch.cpp 파일의 위치를 변경하면 빌드 시 매번 에러를 내뱉는다. 아예 미리 컴파일된 헤더 기능을 꺼버릴 수도 있지만, 당장의 해결 방법은 다른 설정은 그대로 두고 pch.cpp의 C/C++ - Precompiled Headers 속성만 Create (/Yc)로 변경해주는 것인데 근본적인 해결 방법은 나중에 다시 알아볼 생각이다.


No comments:
Post a Comment