【问题标题】:Qt Moc'ing multiple files in parallel under msbuildQt Moc在msbuild下并行处理多个文件
【发布时间】:2012-06-29 11:51:10
【问题描述】:

使用 Qt Visual Studio 插件,它似乎以一种无缝的方式处理了几乎所有的事情。不幸的是,它使用 msbuild 中的 CustomBuild 步骤进行 moc'ing。这导致了一个接一个的连续嘲弄。有没有办法说服 msbuild 并行执行它们 - 我已经厌倦了像我一样坐在桂冠上的 7 个内核。

我看过 msbuild 的 BuildInParallel,但我不确定如何在此处应用它。

msbuild sn-p:

<Project>
...
  <ItemGroup>
    <CustomBuild Include="a_class4.h">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
    </CustomBuild>
    <CustomBuild Include="a_class3.h">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
    </CustomBuild>
  </ItemGroup>
 ...
</Project>

【问题讨论】:

    标签: visual-studio-2010 qt msbuild moc


    【解决方案1】:

    【讨论】:

    • 不幸的是,这仅适用于您使用nmake,如果您使用msbuild,我认为它不适用。
    • @Zac - 对不起,如果我错过了这个,但是我共享的独立 sn-p 是否捕获/实现了你的意图?
    【解决方案2】:

    我对 Visual Studio 项目不是很熟悉……所以不知道“CustomBuild”ItemGroup 名称及其元数据名称是否有意义。如果他们这样做,您可能需要

    1. 将 ItemGroup 名称修改为其他名称
    2. 确定处理该问题的 msbuild 目标文件并修复它以进行并行处理

    这是一个独立的 msbuild 文件,可以并行执行。

    注意事项:

    1. 添加了ping -n 30 -w 1000 127.0.0.2&gt;nul 命令,以便我可以启动进程资源管理器并找到足够的时间来计算生成了多少个 ping.exe 实例。
    2. 我正在尝试 ping 127.0.0.2,因为我希望 ping 不要提前完成。
    3. 文件中没有发生任何实际有用的事情...只是作为概念证明的回显属性。
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunMe">
        <ItemGroup>
            <CustomBuild Include="a_class4.h">
                <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
                <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
                <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
                <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
            </CustomBuild>
            <CustomBuild Include="a_class3.h">
                <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
                <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
                <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
                <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
            </CustomBuild>
        </ItemGroup>
        <Target Name="RunMe">
            <Message Text="First populate an ItemGroup such that we can use it for parallel processing"/>
            <ItemGroup>
                <InputForParallelInvoke Include="$(MSBuildThisFileFullPath)">
                    <Properties>InputFile=%(CustomBuild.Identity);
                            AdditionalInputs=%(CustomBuild.AdditionalInputs);
                            Message=%(CustomBuild.Message);
                            Outputs=%(CustomBuild.Outputs);
                            Command=%(CustomBuild.Command)</Properties>
    
                </InputForParallelInvoke>
            </ItemGroup>
            <MSBuild Projects="@(InputForParallelInvoke)" Targets="InvokeInParallel" BuildInParallel="True" />
        </Target>
        <Target Name="InvokeInParallel">
            <Exec Command="ping -n 30 -w 1000 127.0.0.2>nul &amp; echo Properties=$(InputFile) ##### $(AdditionalInputs) ##### $(Message) ##### $(Outputs) ##### $(Command)"/>
        </Target>
    </Project>
    

    当我通过 msbuild 调用它时,msbuild /m \path\to\file /p:Configuration=Debug;Platform=Win32 我看到 2 个 ping.exe 实例。

    希望这有助于解决您的问题。

    【讨论】:

    • 我尝试过添加&lt;Message Text="Build Group"/&gt; &lt;ItemGroup&gt; &lt;InputForParallelInvoke Include="$(MSBuildThisFileFullPath)"&gt; &lt;Properties&gt;InputFile=%(CustomBuild.Identity); AdditionalInputs=%(CustomBuild.AdditionalInputs); Message=%(CustomBuild.Message); Outputs=%(CustomBuild.Outputs); Command=%(CustomBuild.Command)&lt;/Properties&gt; &lt;/InputForParallelInvoke&gt; &lt;/ItemGroup&gt; &lt;MSBuild Projects="@(InputForParallelInvoke)" Targets="InvokeInParallel" BuildInParallel="True" /&gt;
    • &lt;Target Name="InvokeInParallel"&gt; &lt;Message Text="Build Group"/&gt; &lt;Exec Command="echo bla"/&gt; &lt;/Target&gt; 到“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets”,但总是得到错误“错误 MSB4184 :无法评估表达式“[System.IO.Path]::GetDirectoryName('')”。如果 ti 有效,那就太好了!有任何想法吗?原因是我希望所有自定义构建都并行执行。
    • @Bim - 对不起,我没有关注。请注意,$(MSBuildThisFileFullPath) 将解析为您放置内容的文件...而不是C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets。另外,不清楚您是否尝试过我之前分享的示例独立内容。
    • 我没有尝试独立示例,而是添加了构建组的代码并对Microsoft.CppCommon.targets 文件进行并行编译,该文件通过Microsoft.Cpp.targets 间接包含在我的.vxproj 文件中。该文件有一个部分为项目文件中的所有项目进行自定义构建,添加了CustomBuild(它以&lt;Target Name="CustomBuild" ca. line ~159 行开头)。当我使用 Message 命令输出它们时,我可以看到 ItemGroup 正在使用路径和所有内容正确构建,但是当稍后发出命令时,出现上述路径错误...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多