2012-09-28 2 views
3

복잡한 타사 C++ 라이브러리를 통합하는 Visual Studio 2010 속성 시트를 작성하고 있습니다.MSBuild/VS2010 : VS2010 "속성 시트"에서 "런타임 라이브러리"컴파일러 설정을 참조하는 방법

내 프로젝트에 링크해야하는 라이브러리를 결정하고 (다양한 정의, 포함, 디렉토리 등을 구성하는 것뿐만 아니라), 내 속성 시트는 프로젝트의 현재 구성된 C 런타임 라이브러리 (예 : MultiThreadedDebug ","MultiThreadedDLL "또는"MultiThreadedDebugDLL ").

Condition = " '$(RuntimeLibrary)' == 'MultiThreadedDLL' " 

또 다른 옵션을 제공했지만, 그것은 다음 빌드 작업이었다 유래에 여기 substantially similar question는 지적

그러나, 조건이 MSBuild에서 작동하지 않습니다. 빌드에 도달하기 전에이 값이 필요합니다.

나는 또한 Google과 Microsoft의 MSDN 웹 사이트에서이 값을 얻는 방법을 찾고 비어 있습니다. 어떤 아이디어?

+0

대신 % (ClCompile.RuntimeLibrary)를 사용해보십시오. –

+0

내가 말했듯이, 내가 언급 한 다른 stackoverflow 솔루션에서 제공되었다. 후속 작업 (예 : * .target 파일)에서는 작동하지만 * .prop 파일이 처리되는 시점에는 작동하지 않습니다. – user1707330

답변

2

MSBuild의 XML을 통해 구성된 런타임 라이브러리를 직접 얻을 수있는 방법이 없었기 때문에 프로젝트 파일을 정규 표현했습니다. 다음을 수행 할 XML PropertyGroup 스니 j은 다음과 같습니다.

<PropertyGroup Label="UserMacros"> 
    <RuntimeLibraryRegex> 
    <![CDATA[<ItemDefinitionGroup Condition=".*']]>$(Configuration)\|$(Platform)<![CDATA['">(?:.*\n)*?.*<RuntimeLibrary>(.*)</RuntimeLibrary>(?:.*\n)*?.*</ItemDefinitionGroup>]]> 
    </RuntimeLibraryRegex> 
    <RuntimeLibrary> 
    $([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText($(MSBuildProjectFullPath))), $(RuntimeLibraryRegex)).Result('$1')) 
    </RuntimeLibrary> 
</PropertyGroup> 

이제는 질문의 조건문이있는 그대로 작동합니다.

또한이 MSBuild 속성 그룹 XML은 런타임 라이브러리 기본값이 고려되지 않지만 (예 : 프로젝트에 런타임 라이브러리 집합이없는 경우) 쉽게 작성할 수 있습니다.

+0

MD 또는 MT를 선택한 경우 정보를 얻으려면 다음과 같이 입력하십시오. $ (RuntimeLibrary.ToLower(). LastIndexOf ('dll')) \t _ MD