use*_*330 5 msbuild visual-studio-2010 propertysheet
我正在编写一个 Visual Studio 2010 属性表来集成一个复杂的 3rd 方 C++ 库。
要确定我需要链接到我的项目的库的哪些部分(以及配置各种定义、包含、目录等),我的属性表需要确定项目当前配置的 C 运行时库(即“MultiThreaded”、“ MultiThreadedDebug”、“MultiThreadedDLL”或“MultiThreadedDebugDLL”)。
但是,正如stackoverflow 上的一个基本类似的问题所指出的,这个 MSBuild 条件不起作用:
Condition = " '$(RuntimeLibrary)' == 'MultiThreadedDLL' "
Run Code Online (Sandbox Code Playgroud)
提供了另一个选项,但它用于后续构建任务。在进行构建之前,我需要这个值。
我还搜索了 Google 和 Microsoft 的 MSDN 网站,寻找获得此值的方法,但结果为空。有任何想法吗?
由于无法通过 MSBuild 的 XML 直接获取配置的运行时库,因此我对项目文件进行了正则表达式处理。以下是执行此操作的 XML PropertyGroup 片段:
<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>
Run Code Online (Sandbox Code Playgroud)
现在问题中的条件语句将按原样工作。
另外,请注意,此 MSBuild 属性组 XML 不考虑运行时库默认值(例如,如果项目没有设置运行时库),但可以轻松实现。