如果您使用 qt *.pro 中的 qmake 生成 VC 项目文件,它会以一种在一个线程中编译 mocable 的方式生成它。我知道解决此问题的唯一方法是显式调用 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 文件(将 %VS100COMNTOOLS% 用于 vc2010,将 x86/x64 用于arch):
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:
- 寻找:
</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 自动化它,所以这里是参考的代码片段:
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>
我希望这有帮助