如果使用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>
我希望這有助於