2014-04-15 30 views
6

早上好!Qt MOC與MSBuild並行的多個文件

我知道這裏已經存在這個問題:Qt Moc'ing multiple files in parallel under msbuild但我不會顯示這個老問題。

我在Visual Studio 2010下工作,我必須加快我的應用程序的編譯時間。我使用所有標誌,例如/MP與MSBuild -j與Make等...優化的最後一步是並行MOC'ing步驟。他們很慢,我搜索了很多,我沒有找到解決方案。

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

如果有人已經聽到了解決方案,它應該非常酷!

祝您有美好的一天!

回答

1

如果使用qt * .pro生成包含qmake的VC項目文件,它將以一種方式在一個線程中編譯mocables。我知道解決此問題的唯一方法是顯式調用jom進行moc預處理。

我只VS2012(Win32的msvc2012),但我用來做類似的事情了VS2010(你的情況Win32的msvc2010)

要做到這一點,你應該自動執行以下步驟:

通過QMAKE創建一個從親文件VC項目:

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

qmake -spec win32-msvc2012 -tp vc -o ${path-to-target}/${your-project}.vcxproj ${path-to-source}/${your-qt-pro}.pro 

通過QMAKE創建一個從親Makefile文件

創建旁邊vcproj文件中的以下.bat文件(放在%VS100COMNTOOLS%的VC2010和拱在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包含*。.h文件:

  • 發現:</CustomBuild>
  • 替換到:<ExcludedFromBuild>true</ExcludedFromBuild> </CustomBuild>

2)項目 - > ItemDefinitionGroup:

  • 發現:</Link>
  • 替換到:</Link> <PreBuildEvent> <Command>build_moc.bat</Command> </PreBuildEvent>

3)項目 - > 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自動執行它,所以這裏是參考代碼片段:

build_moc.bat :

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

Maven的腳本,它的替代品(Maven的替代品 - 插件配置):

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

我希望這有助於