【问题标题】:MSBuild - Override MinimalRebuild (/Gm) to falseMSBuild - 将 MinimalRebuild (/Gm) 覆盖为 false
【发布时间】:2019-12-10 00:14:10
【问题描述】:

经过一番研究,要让 VisualStudio 并行构建项目的目标文件,必须确保项目属性 MinimalRebuild 处于关闭状态,MultiProcessorCompilation 处于打开状态。我可以在项目文件中进行配置,但是有没有办法在命令行上使用msbuild 覆盖这些项目设置?

换句话说,使用命令行中的 msbuild,我如何将 MinimalRebuild (/Gm-) 覆盖为 false 并将 MultiProcessorCompilation (/MP) 覆盖为 true?以下似乎不起作用

msbuild /m:7 /p:CL_MPCount=7 /p:MinimalRebuild=false /p:MultiProcessorCompilation=true

顺便说一句,/p:CL_MPCOUNTMultiProcessorCompilation 属性是否多余?总的来说,我很难找到适合 /p 选项的文档。

【问题讨论】:

    标签: c++ visual-studio msbuild


    【解决方案1】:

    换句话说,从命令行使用 msbuild,我将如何 将 MinimalRebuild (/Gm-) 覆盖为 false 和 MultiProcessorCompilation (/MP) 是真的吗?

    CL_MPCount 可以被/p:xxx=xxx 覆盖,但MultiProcessorCompilationMinimalRebuild 不能。需要明确的是,如果它是 MSBuild 的属性,它只能被 /p:xxx=xxx(p 表示属性) 覆盖。并且该属性通常可以通过$ 调用。所以我做了一些测试:

    编辑

    测试

    1)CL_MPCount

    这个值表示VS IDE中并发C++编译的最大数量。可以参考this

    所以我已经通过(调试->选项->项目和解决方案->VC++项目解决方案并将Maximum Number of concurrent C++ compilations设置为2。)

    编写一个自定义目标,例如

    <Target Name ="Test" AfterTargets="Build">
        <Message Importance="high" Text="CL_MPCount is= $(CL_MPCount)">
        </Message>
      </Target>
    

    然后Build就显示出来了;

    由此我们可以看出这是属于MSBuild的一个属性。

    2)最小重建

    通常表示/GM,通常在 c++ 项目的属性中设置。我已将其设置为True(右键单击项目-->属性-->C/C++-->代码生成-->将Enable Minimal Rebuild设置为True)。

    自定义目标,如

    <Target Name ="Test" AfterTargets="Build">
            <Message Importance="high" Text="MinimalRebuild is= $(MinimalRebuild)">
            </Message>
          </Target>
    

    结果是这样的

    据此,$(MinimalRebuild) 无法使用 VS IDE 中设置的值,这意味着它不是 MSBuild 的属性。

    3) 多处理器编译

    它也意味着/MP,从文档中我们会发现它是编译器的一个选项,而不是MSBuild的属性。此外, l 和MinimalRebuild 一样,它没有被输出。所以它也不是 MSBuild 的属性。

    另外,我之前以为MinimalRebuildMultiProcessorCompilation是MSBuild的选项。于是我在命令行中输入MSBuild -help,发现根本没有列出这些参数。所以我觉得这两个参数和MSBuild完全没有关系,只是编译器的一些选项。

    希望对你有帮助。

    【讨论】:

    • 有趣的是你可以覆盖一些东西,例如/p:CL_MPCOUNT 将传递一个额外的参数给cl。我什至找不到CL_MPCOUNT 的记录位置。有没有这样的地方,展示了这些特殊的属性?
    • 有趣。我将研究 Windows 上的铿锵声。它自动生成 msbuild 文件。感谢您的帮助!
    【解决方案2】:

    我找到了一种在用户级别覆盖这两个属性的方法。无论如何,您可能会发现它们很有帮助(例如对于增量构建根本没有意义的构建主机)。

    创建这两个属性文件:

    • %USERPROFILE%\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
    • %USERPROFILE%\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props

    内容如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ImportGroup Label="PropertySheets" />
      <PropertyGroup Label="UserMacros" />
      <PropertyGroup />
      <ItemDefinitionGroup>
        <ClCompile>
          <MinimalRebuild>false</MinimalRebuild>
          <MultiProcessorCompilation>true</MultiProcessorCompilation>
          <ProcessorNumber>2</ProcessorNumber>
        </ClCompile>
      </ItemDefinitionGroup>
      <ItemGroup />
    </Project>
    

    随意自定义ProcessorNumber 以适合您的硬件。

    现在 MSBUild 将为所有项目使用上述值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多