MSBuild / VS2010:如何在VS2010“属性表”中引用“RuntimeLibrary”编译器设置

时间:2012-09-28 21:25:55

标签: visual-studio-2010 msbuild propertysheet

我正在编写一个Visual Studio 2010属性表来集成复杂的第三方C ++库。

要确定我需要链接到项目的库的哪些部分(以及配置各种定义,包含,目录等),我的属性表需要确定项目当前配置的C运行时库(即“MultiThreaded”) “,”MultiThreadedDebug“,”MultiThreadedDLL“或”MultiThreadedDebugDLL“。

但是,正如stackoverflow上的substantially similar question指出的那样,这个MSBuild条件不起作用:

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

提供了另一个选项,但它适用于后续构建任务。在进入构建之前我需要这个值。

我还搜索谷歌和微软的MSDN网站,寻找获得这个价值的方法,并且空洞。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

由于无法通过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>

现在问题中的Condition语句将按原样运行。

另外,请注意,此MSBuild属性组XML不考虑运行时库默认值(例如,如果项目没有设置运行时库),但可以轻松实现。