5

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

我见过 msbuild 的 BuildInParallel,但我不确定如何在这里应用它。

msbuild 片段:

<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>
4

2 回答 2

0

您可以使用并行构建:http jom:
//labs.qt.nokia.com/2009/03/27/speeding-up-visual-c-qt-builds/

于 2012-07-18T13:01:14.460 回答
0

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

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

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

笔记:

  1. 添加了该ping -n 30 -w 1000 127.0.0.2>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 实例。

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

于 2015-04-14T16:14:07.833 回答