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

5

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

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

然而,正如stackoverflow上一个非常相似的问题所指出的那样,这个MSBuild条件不起作用:

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

另外提供了一个选项,但它是针对后续构建任务的。在进行构建之前,我需要这个值。
我还搜索了Google和Microsoft的MSDN网站,试图找到获取此值的方法,但没有任何想法。 有什么建议吗?

1
尝试使用%(ClCompile.RuntimeLibrary)代替。 - Hans Passant
正如我所说的那样,这是我参考的另一个stackoverflow解决方案中提供的。它适用于后续任务(例如在*.target文件中),但不适用于处理*.prop文件的时候。 - user1707330
1个回答

3

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

现在,问题中的条件语句将按原样工作。

此外,请注意,这个MSBuild属性组XML没有考虑运行时库默认值(例如,如果项目没有设置运行时库),但可以很容易地进行修改。


为了获取MD或MT是否被选中的信息,我使用类似以下的代码: <ShortHasMDPos>$(RuntimeLibrary.ToLower().LastIndexOf('dll'))</ShortHasMDPos><!--如果存在MD,则添加下划线--> <ShortUnderscoreMDIfPresent Condition="'$(ShortHasMDPos)'!='-1'">_MD</ShortUnderscoreMDIfPresent> <ShortUnderscoreMDIfPresent Condition="'$(ShortHasMDPos)'=='-1'"></ShortUnderscoreMDIfPresent> - Oliver Zendel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接