Qt Visual Studio 工具 moc 和 qrc 不考虑预构建事件

Qt Visual Studio Tools moc and qrc don't respect pre-build events

我想在编译资源文件(QRC ) 包含它们的地方。通过这种方式,我知道它们总是在更新,更不用说避免在存储库中包含二进制文件了。

我使用 Visual Studio 并安装了 Qt Visual Studio 工具。通常,我会通过项目中的预构建步骤来执行此操作,但它没有被执行并且 QRC 文件的编译总是失败。

1>------ Build started: Project: MyApp, Configuration: Release Win32 ------
1>Rcc'ing MyApp.qrc...
1> RCC: Error in 'C:\src\MyApp\MyApp\MyApp.qrc': Cannot find file 'translations/myapp_en.qm'
1>MyApp.qrc : error 1: rcc (c:\Qt\qt_5_12_3\v141\Win32\bin\rcc.exe)
1>Done building project "MyApp.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 12 up-to-date, 1 skipped ==========

该脚本工作正常,如果作为 post-构建事件或从命令行放置,它会被成功调用。

@echo off

pushd "%1"
for %%F in (*.ts) do (
    c:\Qt\qt_5_12_3\v141\Win32\bin\lrelease -compress %%F -qm %%~nF.qm
)
popd

exit /b 0

我做错了什么?

碰巧我使用的是 Qt VS Tools 的新 Qt/MSBuild 模式。它在内部会在 MSBuild 工作流中生成几个隐藏目标,这些目标在 预构建事件之前执行。

解决方案是改用自定义构建步骤,并进行一些特定设置:

  • QtRcc目标(实际编译资源文件的那个)之前执行
  • Qt VS Tools通过解析QRC文件来检查资源是否被修改,从而可以跳过编译。有必要添加 .qm 翻译文件作为自定义构建步骤的输出。
  • 同样,为了保证翻译始终被编译,将自定义构建步骤的依赖项设置为 .ts 源文件。