【问题标题】:Force project to always build using VS2012/VC11 when using MSBuild使用 MSBuild 时强制项目始终使用 VS2012/VC11 构建
【发布时间】:2016-06-28 11:45:03
【问题描述】:

注意:这与众所周知VS2010/VS2012问题有关,在某些情况下,使用MSBuild构建C++/CLI时必须指定/p:VisualStudioVersion=11.0应用程序。

问题:使用引用 C++/CLI 项目文件的 MSBuild 任务构建我的 VS2012 C++/CLI 应用程序时,我需要将 /p:VisualStudioVersion=11.0 添加到 MSBuild 命令行,否则我会收到此错误:

error MSB8008: Specified platform toolset (v110) is not installed or invalid. Please make sure that a supported PlatformToolset value is selected.

只有在安装了 VS2010 和 VS2012 的机器上构建时才会出现这种情况,甚至是从 Developer Command Prompt for VS2012 或在我自己调用 %VS110COMNTOOLS%\vsvars32.bat 之后。

显然我已经知道解决方法,但我想摆脱始终指定相同的附加命令行参数的要求

一些细节:我有一个 .proj 文件,它设置了用于构建 C++/CLI 应用程序的 MSBuild 任务。这是它的核心(我们称之为Foo.proj):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>

    <CxxProjects
      Include="$(MSBuildThisFileDirectory)src\**\*.vcxproj"
    />

  </ItemGroup>

  <Target Name="build">
    <MSBuild Projects="@(CxxProjects)
             Properties="VisualStudioVersion=11.0"/>
  </Target>

</Project>

以上内容并不完整,仅作说明之用。问题是如上所述为 MSBuild 任务设置属性 VisualStudioVersion 没有帮助。我仍然得到相同的 MSB8008 错误。除非...是的,使用MSBuild Foo.proj /p:VisualStudioVersion=11.0

是否有可能以某种方式解决这个问题 - 我在这里遗漏了什么?如果我只知道如何(我已经尝试过),我什至可以自己编辑单个 .vcxproj 文件。

【问题讨论】:

  • 您知道吗:blogs.msdn.microsoft.com/webdev/2012/08/21/… 我建议您使用它链接到此处的 AdditionalProperties 技巧:sedodream.com/2009/04/29/…
  • 我实际上阅读了那篇博文,但从未尝试过 AdditionalProperties。也许需要试一试。
  • @SimonMourier:将其发布为回复,我将奖励您。阅读我自己对该问题的回答以了解基本原理。

标签: visual-studio-2010 visual-studio-2012 msbuild c++-cli


【解决方案1】:

取决于您要修复的级别。

在 Microsoft.Cpp.Platform.targets 中有一个您可以使用的导入语句:

<Import Condition="'$(_ToolsetFound)' == 'true' and Exists('$(_PlatformFolder)ImportAfter')" Project="$(_PlatformFolder)ImportAfter\*.targets"/>

从特定平台相关的 ImportAfter 文件夹中导入所有 *.targets 文件。您可以定义在全局级别设置任何属性的最简单文件(适用于所有 .vcpproj 文件)

编辑1 这是该文件的内容,你可以随意命名,只要确保它与上面的通配符*.targets.匹配你必须找出文件的正确路径(在$(_PlatformFolder)属性中查找路径是什么

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup><VisualStudioVersion>11.0</VisualStudioVersion></PropertyGroup> </Project>

/编辑1

或者您可以使用此从 Microsoft.Cpp.Current.targets 导入

<Import Condition=" '$(ForceImportAfterCppTargets)' != '' and exists('$(ForceImportAfterCppTargets)')" Project="$(ForceImportAfterCppTargets)"/> 只需声明 $(ForceImportAfterCppTargets) 属性,该属性指向单个特定文件,该文件将为每个平台覆盖它。

编辑2 如果你只想影响你的构建脚本,这种方法会更好——你必须做同样的事情(在edit1中放置一个文件)并通过 $(ForceImportAfterCppTargets) 财产。您的构建脚本将具有以下内容:

<MSBuild Projects="@(CxxProjects) Properties="ForceImportAfterCppTargets=path_to_my_targets"/>

/编辑2

或者你可以创建对应的环境变量-MSBuild emits Properties from Environment variables

希望这会有所帮助。

PS:如果您可以使用/verbosity:diag 生成一个 msbuild 日志,这可能会对您和我们有很大帮助 - 一定会更容易查看完整且非常详细的日志。两组日志 - 一组具有成功的构建结果,另一组失败将有更多帮助

【讨论】:

  • 我应该把上面的语句放在哪里?至于环境变量,我知道这一点,但不幸的是,这不是我想要的。
  • 嗯,我需要做一个工作示例来玩一下设置。我不是 VC++ 开发人员,所以不确定确切的更改。关于第一部分-您可以制作一个文件,比如说 MyImportAfter.targets 具有特定覆盖(请参阅edit1)。将它放在您的机器\构建服务器上的文件夹中,它将影响您的所有构建。那台机器上的每一个人。
  • 感谢您的建议,不过我已经发现问题并会尽快发布解决方案。
【解决方案2】:

VS2012 与 VS2010 组合特有的问题,这里有详细描述:Visual Studio project compatibility and VisualStudioVersion

如果您从命令行(不是开发人员 提示),则使用的 VisualStudioVersion 的值为 10.0。那 是我上面展示的属性的产物。在这种情况下 您应该将其作为 MSBuild 属性传递。例如

msbuild.exe MyAwesomeWeb.csproj /p:VisualStudioVersion=11.0

在这 如果我明确地传递了属性。这将始终覆盖 确定 VisualStudioVersion 值的任何其他机制。如果 您在构建脚本中使用 MSBuild 任务,那么您可以指定 Properties 属性中的属性或 AdditionalProperties 属性。

该帖子有一个指向另一个帖子的链接:MSBuild: Properties and AdditionalProperties Known Metadata。这篇文章解释了这一点:

不同之处在于,如果您使用属性指定属性 元数据,然后使用 Properties 属性定义的任何属性 MSBuild 任务将被忽略。与此相反,如果您使用 AdditionalProperties 元数据,那么这两个值都将被使用,并带有 首选项转到 AdditionalProperties 值。

因此,一种解决方案是使用AdditionalProperties 元数据,它允许在 msbuild 过程的后期定义属性,如下所示:

<Project ToolsVersion="4.0" DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <CxxProjects Include="$(MSBuildThisFileDirectory)src\**\*.vcxproj">
        <AdditionalProperties>VisualStudioVersion=11.0</AdditionalProperties>
    </CxxProjects>
  </ItemGroup>

  <Target Name="build">
    <MSBuild Projects="@(CxxProjects) />
  </Target>

</Project>

【讨论】:

  • 正如我在my own reply 中所说的,我的问题略有不同,但您的评论促使我找到了解决方案。谢谢。
【解决方案3】:

您可以通过将以下标记添加到属性组来指定项目文件中的特定工具集:

<PlatformToolset>v110</PlatformToolset>

你根本不需要任何外部参数。

【讨论】:

  • 抱歉,没用。仍然是相同的 MSB8008 错误。已经尝试过类似的方法。
  • 不幸。我有类似的情况,安装了三个版本的 Visual Studio(目前),它对我来说运行良好。
  • 顺便说一句,我还定义了这些环境变量:VS110COMNTOOLS、VS120COMNTOOLS、VS140COMNTOOLS
  • 我也是,还有 VS100COMNTOOLS。您是否真的安装了 VS2010(我相信这就是问题所在)?
  • 没有安装VS2010,抱歉。可以想象,您有一个旧版本的 MSBuild,不知何故无法获取其他工具集版本
【解决方案4】:

所以,就这样吧。以下是 实际 最小复制案例 - 我的问题中的那个确实有效。我想我是在这么多不同的小改动之间来回切换,以至于我最终在没有实际测试确切代码的情况下发布。很抱歉。

罪魁祸首是假设 VisualStudioVersion 最初没有设置,除非我自己做 - 至少在构建过程的早期没有设置。对我来说,MSBuild 依赖于 Visual Studio 是非常不直观的,而不仅仅是相反。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <!--
      The below causes the problem - VisualStudioVersion already
      have a 'default' value of 10.0 at this point and therefore
      is never set to 11.0
    -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' != ''">11.0</VisualStudioVersion>
  </PropertyGroup>

  <ItemGroup>

    <CxxProjects
      Include="$(MSBuildThisFileDirectory)src\**\*.vcxproj"
    />

  </ItemGroup>

  <Target Name="build">
    <MSBuild Projects="@(CxxProjects)
             Properties="VisualStudioVersion=$(VisualStudioVersion)"/>
  </Target>

</Project>

但对我来说从来没有用过的是直接在 .vcxproj 文件中设置 VisualStudioVersionPlatformToolset(是的,这次是无条件地)——这在构建过程中似乎为时已晚,至少在构建时这种特殊的方式。

让我感到困惑的另一件事是,即使明确为 VS2012 设置构建环境,VisualStudioVersion 属性默认为 VS2010。

感谢回复的人。真正让我发现问题的是对我最初关于使用&lt;AdditionalProperties&gt; 的问题的评论。我尝试了这个并且“意外”硬编码11.0 而不是使用$(VisualStudioVersion) - 这导致我通过无条件设置VisualStudioVersion 使其也适用于我的其他情况:

<PropertyGroup>
  <VisualStudioVersion>11.0</VisualStudioVersion>
</PropertyGroup>

因此,如果该评论者将他的建议作为回复而不是评论发布,我将奖励他。否则我就让自动奖励发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2018-05-06
    相关资源
    最近更新 更多