【问题标题】:How do you create custom build rules in QTCreator for code generation?如何在 QTCreator 中创建自定义构建规则以生成代码?
【发布时间】:2020-04-10 21:34:07
【问题描述】:

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

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

我尝试过使用自定义构建步骤,但如果我这样做了,那么 QT 每次都会重新构建文件,即使它没有更改,这会减慢进程。此外,如果 C 文件尚不存在,它将失败,并显示“没有规则使 'x.o' 需要目标 'x.c'。停止。”错误,所以无论如何我都必须手动运行程序。

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

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

【问题讨论】:

    标签: qt-creator


    【解决方案1】:

    您可以在 qmake 文件中添加自定义目标(而不是在 QtCreator 项目配置中)。请参阅https://doc.qt.io/qt-5/qmake-advanced-usage.html#adding-custom-targets 和/或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
    

    【讨论】:

    • 我试过这个,得到“没有规则来制作目标 'glib-resources.xml','glib-resources.c' 需要。停止。”我做了一些搜索,找到了this page,但无法弄清楚如何配置自定义目标。
    • 我已经通过实际使用 $$glib_resources.depends 变量来编辑我的答案。 (这是我在演示代码中不小心留下的一个错误)我的猜测是您只更改了一次“glib-resources.xml”文件名。现在在glib_resources.depends = glib-resources.xml 行中就足够了。如果它仍然无法正常工作,请发布您的 .pro 文件(或至少相关部分)
    • 我想到了这一点,并仔细检查了我在这两个地方都更改了名称。我什至将我的实际文件重命名为glib-resources.xml,然后直接复制粘贴代码而不进行修改。仍然得到同样的错误。但是,当我搜索该错误消息时,您的帖子确实引导我找到了正确的答案。所以,即使我不能使用你的代码,我最终还是想出了如何去做。
    【解决方案2】:

    这是我最终解决自己问题的方法:

    我在 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,他的帖子让我找到了正确的答案。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多