Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过CMake使用glib编译资源_Cmake_Gtk - Fatal编程技术网

如何通过CMake使用glib编译资源

如何通过CMake使用glib编译资源,cmake,gtk,Cmake,Gtk,随着任何GTK项目的发展,GTK应用程序往往与gresources捆绑在一起,以分离代码和UI设计。这是非常有用的,因为UI/UX设计者不需要知道代码就可以。。。精心设计并最终为项目贡献他们的技能和努力 不仅设计师,程序员也受益匪浅!因为代码变得非常“逻辑或问题解决”,而不是在一个文件中同时维护UI和逻辑代码 然而,要编译我们的GResource,我们需要glibcompileresources实用工具。该命令通常如下所示: glib编译资源--生成源代码--目标= 但是我如何创建编译我们的g

随着任何GTK项目的发展,GTK应用程序往往与gresources捆绑在一起,以分离代码和UI设计。这是非常有用的,因为UI/UX设计者不需要知道代码就可以。。。精心设计并最终为项目贡献他们的技能和努力

不仅设计师,程序员也受益匪浅!因为代码变得非常“逻辑或问题解决”,而不是在一个文件中同时维护UI和逻辑代码

然而,要编译我们的GResource,我们需要
glibcompileresources
实用工具。该命令通常如下所示:

glib编译资源--生成源代码--目标=

但是我如何创建编译我们的gresource文件并将其与目标项目链接的构建脚本呢?我仍然是一个学习CMake的新手,我已经知道了什么是目标,如何设置变量,如何链接目标,以及如何使用所需的GTK包进行链接。但是我不知道如何继续解决这个问题:(

一个解决方案是使用
add\u custom\u command()
来编译你的gresources。但是首先,这里是你需要的CMake脚本的分解:

cmake_minimum_required(VERSION 3.15)

project(dummy)

# Step 1:
find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED)

set(GRESOURCE_C   test.gresource.c)
set(GRESOURCE_XML test.gresource.xml)

# Step 2:
add_custom_command(
    OUTPUT ${GRESOURCE_C}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND ${GLIB_COMPILE_RESOURCES}
    ARGS
        --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
        ${GRESOURCE_XML}
    VERBATIM
    MAIN_DEPENDENCY ${GRESOURCE_XML}
    DEPENDS
        for.glade
        bar.glade
)

# Step 3:
add_custom_target(
    dummy-resource
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
)

# Step 4:
add_executable(${PROJECT_NAME} dummy.c ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
set_source_files_properties(
    ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
    PROPERTIES GENERATED TRUE
)

# Step 5:
add_dependencies(${PROJECT_NAME} dummy-resource)
  • 拉入glib编译资源作为可执行程序-
    find_program()
  • 定义如何编译gresource-
    添加自定义命令()
  • 然后定义自定义目标-
    添加自定义目标()
  • 告诉CMake资源是生成的文件-
    set\u source\u files\u properties()
  • 最后,将自定义目标作为依赖项添加到项目目标中-
    add\u dependencies()
  • 下面是一个示例CMake脚本:

    cmake_minimum_required(VERSION 3.15)
    
    project(dummy)
    
    # Step 1:
    find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED)
    
    set(GRESOURCE_C   test.gresource.c)
    set(GRESOURCE_XML test.gresource.xml)
    
    # Step 2:
    add_custom_command(
        OUTPUT ${GRESOURCE_C}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        COMMAND ${GLIB_COMPILE_RESOURCES}
        ARGS
            --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
            ${GRESOURCE_XML}
        VERBATIM
        MAIN_DEPENDENCY ${GRESOURCE_XML}
        DEPENDS
            for.glade
            bar.glade
    )
    
    # Step 3:
    add_custom_target(
        dummy-resource
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
    )
    
    # Step 4:
    add_executable(${PROJECT_NAME} dummy.c ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
    set_source_files_properties(
        ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
        PROPERTIES GENERATED TRUE
    )
    
    # Step 5:
    add_dependencies(${PROJECT_NAME} dummy-resource)
    
    简要说明 添加自定义命令()
    • 输出
      -这是您生成的资源文件
    • 工作目录
      -XML和glade文件所在的位置
    • 逐字记录
      -确保我们的
      命令
      接收到的
      参数保持不变
    • MAIN\u依赖关系
      -用于glib编译资源
    • 取决于
      -您的glade文件。如果任何文件发生更改,则会触发您的目标构建:)
    添加自定义目标()
    • 虚拟资源
      -这是您的自定义目标名称
    • 取决于
      -自定义目标触发自定义命令所需的输出
    设置源文件属性() 首次使用
    cmake
    命令生成生成文件时,尚未生成资源文件。因此,CMake将遇到错误,因为它不知道资源文件在哪里或来自哪里。我们需要告诉CMake“不要失败,我们的资源文件将在稍后生成”

    使用
    --生成依赖项
    ,而不是硬编码 现在您可能会注意到,我们正在重复我们的工作,即,当我们添加新的glade文件或删除现有文件(或任何其他资源,如图标、声音、css文件等)时,我们必须编辑XML和CMake脚本文件<代码>glib编译资源
    已经提供了依赖项生成,因此我们可以在CMake脚本中使用它,并使之智能化

    诀窍是将.xml文件作为配置文件更改为.xml.in。因此,当配置文件发生更改时,可以使用--generate dependencies调用glib工具,获取新的依赖项输出值,并将其发送到
    add\u custom\u命令(…dependens)
    。现在我们有了一个智能CMake:)

    如果你想采用这种方法,那么下面的帖子将非常有用:


    祝你好运:)

    回答得很好。做得好!假设我有多个资源文件(
    file1.gresource.xml
    file2.gresource.xml
    )-我该怎么做才能不必在我的CMake文件中重复两次
    add_custom_命令
    ?有可能吗?应该有可能。到目前为止还没有真正遇到这种需要。然而,我认为循环每个gresource文件,然后在循环中处理
    add\u custom\u命令
    ,应该可以做到这一点,但我不知道如何处理ouptut目标依赖关系。也许您可以在一个示例测试项目上尝试它,找出它,并创建一个新的StackOverflow post。可以帮助我和未来的读者;)