【问题标题】:MSBuild/VS2010: How to reference "RuntimeLibrary" compiler setting in a VS2010 "Property Sheet"MSBuild/VS2010:如何在 VS2010“属性表”中引用“RuntimeLibrary”编译器设置
【发布时间】:2012-09-20 18:52:12
【问题描述】:

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

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

但是,正如 stackoverflow 上的 substantially similar question 所指出的,此 MSBuild 条件不起作用:

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

提供了另一个选项,但它是针对后续构建任务的。在构建之前我需要这个值。

我还搜索了 Google 和 Microsoft 的 MSDN 网站,寻找获得此价值的方法,但结果一无所获。有什么想法吗?

【问题讨论】:

  • 改用%(ClCompile.RuntimeLibrary)
  • 正如我所说,这是在我引用的其他 stackoverflow 解决方案中提供的。它适用于后续任务(例如在 *.target 文件中),但不适用于处理 *.prop 文件时。

标签: visual-studio-2010 msbuild propertysheet


【解决方案1】:

由于无法通过 MSBuild 的 XML 直接获取配置的运行时库,因此我对项目文件进行了正则表达式。这是执行此操作的 XML PropertyGroup sn-p:

<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 不考虑运行时库默认值(例如,如果项目没有设置运行时库),但可以轻松实现。

【讨论】:

  • 要获取选择 MD 或 MT 的信息,我使用如下内容:$(RuntimeLibrary.ToLower().LastIndexOf('dll'))_MD
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 2012-07-30
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多