Qt MOC与MSBuild并行的多个文件

Clo*_*any 8 msbuild qt visual-studio-2010 moc

早上好!

我知道这里已经有了这个问题:Qt在msbuild下并行多个文件,但我不会出现这个老问题.

我在Visual Studio 2010下工作,我必须加快我的应用程序的编译时间.我使用所有标志,如/MPMSBuild -j和Make等...优化的最后一步是并行化MOC的步骤.他们的速度非常缓慢,我搜索了很多,但我没有找到解决方案.

我知道它jom存在,但它使用nmake,我必须使用MSBuild.

如果有人已经听过解决方案,那应该真的很酷!

祝你今天愉快!

小智 2

如果您使用 qmake 从 qt *.pro 生成 VC 项目文件,它会以在一个线程中编译 mocables 的方式生成该文件。我知道解决此行为的唯一方法是显式调用 jom 进行 moc 预处理。

我只有VS2012(win32-msvc2012),但我曾经对VS2010做过类似的事情(在你的例子中是win32-msvc2010)

为此,您应该自动执行以下步骤:

通过qmake从pro文件创建VC项目:

qmake -spec win32-msvc2012 -tp vc -o ${path-to-target}/${your-project}.vcxproj ${path-to-source}/${your-qt-pro}.pro
Run Code Online (Sandbox Code Playgroud)

通过 qmake 从 pro 文件创建 makefile:

qmake -spec win32-msvc2012 CONFIG+=release -o ${path-to-target}/Makefile', ${path-to-source}/${your-qt-pro}.pro
Run Code Online (Sandbox Code Playgroud)

在 vcproj 文件旁边创建以下 .bat 文件(对于 vc2010,输入 %VS100COMNTOOLS%;对于 arch,输入 x86/x64):

call "%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" ${arch}
md build\release\generated 
${environment.dir}\bin\jom.exe -j 16 /F Makefile.release mocables
Run Code Online (Sandbox Code Playgroud)

要进行调试构建,请将“release”更改为“debug”(或引入一个变量)

现在需要编辑VC工程文件。以下是您需要查找/替换的内容(使用正则表达式):

1) 对于所有包含(包含 *.h 文件的标签 Project->ItemGroup->CustomBuild Include):

  • 寻找:</CustomBuild>
  • 替换为:<ExcludedFromBuild>true</ExcludedFromBuild> </CustomBuild>

2) 对于项目->项目定义组:

  • 寻找:</Link>
  • 替换为:</Link> <PreBuildEvent> <Command>build_moc.bat</Command> </PreBuildEvent>

3) 对于 Project->ItemDefinitionGroup: - 查找: <ItemDefinitionGroup> - 替换为:<Target Name="BeforeClean"> <Message Text="Cleaning moc generated files"/> <Exec Command="del \$\(ProjectDir\)..\\\$(Platform\)\\build\\${arch}\\generated\\moc_*.* /F /Q" /> </Target> <ItemDefinitionGroup>

我使用 Maven 将其自动化,因此这里是供参考的代码片段:

构建_moc.bat:

cd %1
md build\%2\generated 
c:\\develop\\buildenv\bin\jom.exe -j 16 /F Makefile.%2 mocables
Run Code Online (Sandbox Code Playgroud)

执行替换的 Maven 脚本(maven-replacer-plugin 配置):

<!-- Disabling moc preprocessor steps, since we do it with jom -->                                        
<replacement>
    <xpath>//Project/ItemGroup/CustomBuild[contains(@Include,'.h')]</xpath>
    <token><![CDATA[</CustomBuild>]]></token>
    <value><![CDATA[
      <ExcludedFromBuild>true</ExcludedFromBuild>
    </CustomBuild>
                                            ]]></value>
</replacement>

<!-- Adding moc preprocessor steps with jom -->
<replacement>
    <xpath>//Project/ItemDefinitionGroup[not(@*)]</xpath>
    <token><![CDATA[</Link>]]></token>
    <value><![CDATA[
    </Link>
    <PreBuildEvent>
      <Command>\$\(ProjectDir\)../${arch}/build_moc.bat \$\(ProjectDir\)../${arch} \$\(Configuration\)</Command>
    </PreBuildEvent>
                                            ]]></value>
</replacement>

<!-- Cleaning moc files -->
<replacement>
<token><![CDATA[<ItemDefinitionGroup>]]></token>
<value><![CDATA[
    <Target Name="BeforeClean">
    <Message Text="Cleaning moc generated files"/>
    <Exec Command="del \$\(ProjectDir\)..\\\$\(Platform\)\\build\\${arch}\\generated\\moc_*.* /F /Q" />
    </Target>
    <ItemDefinitionGroup>
                                            ]]></value>
</replacement>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助