2017-01-07 5 views
0

나는 C++ 나는 MSBuild를 내 프로젝트 파일에 다음을 얻을 비주얼 스튜디오 프로젝트 생성 :ProjectConfiguration PropertyGroup (MSBuild를) 대

<ProjectConfiguration Include="Debug|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
</ProjectConfiguration> 

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> 
    <ConfigurationType>Application</ConfigurationType> 
    <UseDebugLibraries>true</UseDebugLibraries> 
    <PlatformToolset>v140</PlatformToolset> 
    <CharacterSet>Unicode</CharacterSet> 
</PropertyGroup> 

내가 차이는 두 부분 사이에 무엇인지 이해하지 못하는입니다. 다음을 실행할 때 :

MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 

어느 것을 적용하고 있습니까? 그들은 하나로 합쳐 졌습니까? 나는 ProjectConfiguration의 "include"와 PropertyGroup의 "condition"의 차이를 이해하지 못합니다.

+0

PropertyGroup의 요소를 추가하면 UseDebugLibraries와 같은 매개 변수의 다른 값을 사용합니다. 자세한 내용은 https : //msdn.microsoft.com/en-us/library/dd293607을 참조하십시오.aspx –

답변

1

우선 중요한 부분을 붙여 놓기를 놓쳤습니다. 결과적으로 표시되는 내용은 유효한 msbuild 구문이 아닙니다. 'ProjectConfiguration'은 ItemGroup 내부에 있으므로 Item입니다. 그래서 완전한 정의는 예를 들어, 실제로 :

<ItemGroup> 
    <ProjectConfiguration Include="Debug|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Release|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
    </ProjectConfiguration> 
</ItemGroup> 

이 2 개 요소라는 ProjectConfiguration '당신이 전화를 원하는'목록/배열/수집/정의합니다. 첫 번째 요소는 "Debug | Win32"이고 2 개의 Metadata 항목이 있습니다. 첫 번째 요소는 값이 'Debug'인 'Configuration'이고 두 번째 요소는 'Win32'값을 갖는 'Platform'입니다. ProjectConfiguration 항목은 기본적으로 VS의 GUI를 포함하여 빌드 시스템에 알려주는 목록으로, 프로젝트에 어떤 구성/플랫폼 조합이 존재 하는지를 나타냅니다.

Properties은 PropertyGroup에 정의되어 있으며 키/값 쌍입니다. PropertyGroup의 Condition 속성은 조건이 일치하는 경우에만 정의되는 속성으로 연결됩니다. 따라서 Include와 Condition 모두 xml 속성이지만 완전히 다른 용도로 사용됩니다. 첫 번째 항목은 Item 컬렉션에 요소를 추가하고 두 번째 항목은 조건부입니다 (거의 모든 다른 msbuild에 배치 할 수 있음). 요소, Item 또는 ItemGroup에도 있음) False로 평가되면 내용이 삭제됩니다.

다음을 실행할 때 : MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 적용되는 것은 무엇입니까? 그들은 하나로 합쳐 졌습니까?

/p를 전달하는 명령 줄에 속성을 정의 (일반적으로 프로젝트 파일에 지정된보다 우선 명령 줄에 정의 또한 등록 정보)를 PropertyGroup에 정의 된 속성에서 전혀 다른. 이제 ItemGroup의 경우 명령 행에서 전달한 것과 아무런 차이가 없습니다. 빌드 시스템에 어떤 조합을 사용할 수 있는지 알려주는 2 가지 요소가 여전히 포함되어 있습니다. 어떤 속성이 적용 되느냐는 변경됩니다. 고려 :

$() 구문이 통과 그래서 만약 속성 값을 확장하는 데 사용됩니다
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
    <UseDebugLibraries>true</UseDebugLibraries> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> 
    <UseDebugLibraries>false</UseDebugLibraries> 
</PropertyGroup> 

/P : 구성 = 디버그, 플랫폼 = Win32에서 명령 줄 다음에 '$ (구성) | $ (플랫폼)'== ' Debug | Win32 ' "구문 분석 및 평가 후'Debug | Win32 '=='Debug | Win32 '"가 True로 평가됩니다. 따라서 첫 번째 PropertyGroup 정의가 적용되지만 후자의 경우 조건이 일치하지 않으므로 두 번째 PropertyGroup 정의는 적용되지 않습니다. 결과적으로 'UseDebugLibraries'라는 속성은 'true'값을 가져옵니다. 당신은/p : Configuration = Release, Platform = Win32 대신에 'false'값을 얻을 것입니다. 이것은 궁극적으로 실행 된 컴파일러/링커 명령을 변경하고 사용할 런타임 라이브러리를 알려주는 플래그를 전달하는 데 사용됩니다.

+0

두 가지를 결합 할 수는 없습니까? 즉, Condition = " '$ (Configuration) | $ (Platform)'== 'Debug | Win32'"가 항상 일치하도록 ProjectConfiguration에 PropertyGroup 요소를 추가 할 수 있습니까? Include = "Debug | Win32 "? – user651351

+0

당신은 그렇게 할 수는 있지만 동일하지는 않습니다 : ProjectConfiguration과 같은 항목은 여러 요소를 가지며 하나의 속성은 하나의 키/값 쌍입니다. – stijn