기술(Tech, IT)/C++

[Tech, C++] 공통 프로젝트에 대한 솔루션 별 전처리기 정의

Daniel803 2024. 3. 17. 06:33

Visual Studio 를 통해 C++ 작업을 하다보면 Solution과 Project를 생성하게 된다. 둘에 대해 간단하게 정리하자면 Solution은 하나 이상의 Project를 포함하고, Project는 source code, resource, configuration 등의 파일과 개별 application, library, component 등에 대한 build 지침을 포함하고 있다.

 

큰 프로그램을 작성하다보면 공통으로 사용되는 코드가 발생한다. 예를 들어, A라는 Project가 공통으로 사용되는 Project일 때, 여러 Solution이 A를 import해 공유해 사용한다고 가정하자. (import를 통한 공유를 하지 않고, 각 Solution 내에 개별적으로 같은 내용의 코드를 갖고있다면, 공통 코드의 업데이트가 발생했을 때 일일이 수정을 해야하는 maintainability에 심각한 저하가 발생한다.)

 

이 때 공통 코드 부분에 분기가 필요한 경우 전처리기(Preprocessor)를 사용해 처리가 가능하다. 하지만 전처리기 정의를 Solution 마다 다르게 가져가기 위해선 별도의 작업이 필요하고 이 부분을 가능하게 하는 파일이 biuld 지침을 가지고 있는 .vcxproj 파일이고, 아래에서 과정을 소개한다.

 

  1. .vcxproj 파일 열기
    : Solution 탐색기에서 프로젝트를 마우스 오른쪽 버튼 클릭 후 프로젝트를 unload 한 다음 다시 마우스 오른쪽 버튼 클릭 후 "[YourProjectName].vcxproj 편집"을 선택한다.(.vcxproj는 notepad++를 통해서도 편집이 가능하다.)

  2. ItemDefinitionGroup을 찾거나 생성
    : 수정하려는 configuration과 일치하는 기존 ItemDefinitionGroup을 찾거나 생성한다. 예를 들어, Debug Configuration에 대한 정의를 추가하려면 아래와 같이 처리한다.
    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">​
  3. 전처리기 정의 추가
    : ItemDefinitionGroup 내에서 전처리기 정의를 포함하도록 ClCompile 섹션을 추가하거나 수정한다. 예를 들어, MY_CUSTOM_MACRO를 정의하면 아래와 같다.
    <ClCompile>
      <PreprocessorDefinitions>$(PreprocessorDefinitions);MY_CUSTOM_MACRO</PreprocessorDefinitions>
    </ClCompile>​
  4. Solution에 기반한 조건부 definition
    : Solution을 기반으로 definition를 추가하는 경우 먼저 Project 파일 맨 위(ItemDefinitionGroup 외부)에 조건을 정의한 다음 해당 조건을 사용해 정의를 적용할 수 있다.
    <PropertyGroup>
      <MySolutionCondition>'$(SolutionPath)' == 'Path\To\MySolutionA.sln'</MySolutionCondition>
    </PropertyGroup>
    <ItemDefinitionGroup Condition="'$(MySolutionCondition)'=='true'">
      <ClCompile>
        <PreprocessorDefinitions>$(PreprocessorDefinitions);SOLUTION_A</PreprocessorDefinitions>
      </ClCompile>
    </ItemDefinitionGroup>​
  5. Project 저장 후 reload
    : 변경한 후 .vcxproj 파일을 저장하고 편집기를 닫은 다음 Solution 탐색기에서 프로젝트를 마우스 오른쪽 버튼 클릭 후 "프로젝트 다시 로드"를 선택한다. (notepad++와 같은 편집기로 편집했으면 바로 저장만 해도 적용된다.

.vcxproj 파일은 앞서 얘기한대로 build에 대한 지침을 담고 있기 때문에 매우 주의 깊은 편집을 요구한다. 잘못 편집된 .vcxproj 파일은 정상적으로 동작하던 Project를 망가뜨릴 수 있으므로 편집 전 백업을 해두는 것을 추천한다.

 

참고

- https://learn.microsoft.com/ko-kr/cpp/build/reference/vcxproj-file-structure?view=msvc-170