【问题标题】:Qt MOC multiple files in parallel with MSBuildQt MOC 多个文件与 MSBuild 并行
【发布时间】:2014-04-15 08:31:20
【问题描述】:

早上好!

我知道这里已经有这个问题:Qt Moc'ing multiple files in parallel under msbuild 但我不会出现这个老问题。

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

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

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

祝你有美好的一天!

【问题讨论】:

    标签: visual-studio-2010 qt msbuild moc


    【解决方案1】:

    如果您使用 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
    

    通过 qmake 从 pro 文件创建 makefile:

    qmake -spec win32-msvc2012 CONFIG+=release -o ${path-to-target}/Makefile', ${path-to-source}/${your-qt-pro}.pro
    

    在 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
    

    要进行调试构建,请将“发布”更改为“调试”(或引入变量)

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

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

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

    2) 对于项目->ItemDefinitionGroup:

    • 找到:&lt;/Link&gt;
    • 替换为:</Link> <PreBuildEvent> <Command>build_moc.bat</Command> </PreBuildEvent>

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

    我是用 Maven 自动化的,所以这里是代码 sn-p 供参考:

    build_moc.bat:

    cd %1
    md build\%2\generated 
    c:\\develop\\buildenv\bin\jom.exe -j 16 /F Makefile.%2 mocables
    

    执行替换的 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>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2012-05-14
      • 2010-11-23
      • 1970-01-01
      • 2020-11-27
      相关资源
      最近更新 更多