如何在 QTCreator 中创建用于代码生成的自定义构建规则?

How do you create custom build rules in QTCreator for code generation?

我正在开发一个 GTK3 应用程序,但使用 QTCreator 作为我的 IDE,只是因为我碰巧喜欢它。它工作正常,我可以轻松关闭所有 QT 特定的东西和 link GTK 库。只有一个小问题。

GTK 使用 XML 文件来定义其资源。它带有一个程序 "glib-compile-resources",它接受一个 .gresource.xml 文件并生成一个 .c 文件*,然后可以将其包含在您的项目中。问题是 QTCreator 不知道 glib-compile-resources,所以每次我对它们进行任何更改时,我都必须记住手动 运行 程序。

我试过使用自定义构建步骤,但如果我这样做,QT 每次都会重建文件,即使它没有改变,这会减慢进程。此外,如果 C 文件不存在,它将因 "No rule to make target 'x.c' needed by 'x.o'. Stop." 错误而失败,因此我必须手动 运行 程序。

有没有办法让QTCreator在遇到.gresource.xml文件时运行 glib-compile-resources,并将生成的C文件包含到最终编译中?

*除了直接的 C 源文件之外,还有其他选项可用,但 C 源文件对我来说是最简单的。

您可以在您的 qmake 文件中添加自定义目标(而不是在您的 QtCreator 项目配置中)。请参阅 https://doc.qt.io/qt-5/qmake-advanced-usage.html#adding-custom-targets and/or https://doc.qt.io/qt-5/qmake-advanced-usage.html#adding-compilers.

处的 qmake 文档

更新:这是一个简单的示例,展示了如何使用 .pro 文件中的自定义目标机制对单个文件执行此操作:

glib_resources.target = glib-resources.c
glib_resources.depends = glib-resources.xml
glib_resources.commands = glib-compile-resources --target  $$glib_resources.target --generate-source $$glib_resources.depends


QMAKE_EXTRA_TARGETS += glib_resources 
PRE_TARGETDEPS += glib-resources.c ## set this target as a dependency for the actual build
QMAKE_CLEAN += glib-resources.c  ## delete the file at make clean

以下是我如何解决自己的问题:

我在 QT 文档中找到了如何 add your own custom compiler 到 QT 项目文件。需要的确切行是:

GLIB_RESOURCE_FILES += \
    resources.gresource.xml
    # Add more resource files here.

glib_resources.name = glibresources
glib_resources.input = GLIB_RESOURCE_FILES
glib_resources.output = ${QMAKE_FILE_IN_BASE}.c
glib_resources.depend_command = glib-compile-resources --generate-dependencies ${QMAKE_FILE_IN}
glib_resources.commands = glib-compile-resources --target ${QMAKE_FILE_OUT} --sourcedir ${QMAKE_FILE_IN_PATH} --generate-source ${QMAKE_FILE_IN}
glib_resources.variable_out = SOURCES
glib_resources.clean = ${QMAKE_FILE_OUT}

QMAKE_EXTRA_COMPILERS += glib_resources

(感谢@zgyarmati,post 引导我找到正确答案。)