You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gtk4中加载Gio Resources?资源加载报错求助

Gtk4中正确加载Gio Resources解决资源不存在报错

问题场景

尝试从Gio资源文件加载CSS主题时,程序运行抛出以下警告:

(main:44395): Gtk-WARNING **: 13:58:23.068: Theme parser error: <broken file>:1:1: The resource at “/com/example/app/css/style.css” does not exist

相关文件及操作如下:

style.css(基础样式文件)

window {
    background-color: orchid;
}

main.c(Gtk应用代码)

#include <gtk/gtk.h>

extern GResource *gresources_get_resource(void);

static void activate(GtkApplication* application, gpointer data) {
  GtkWidget* window = gtk_application_window_new(application);
  GtkCssProvider* provider = gtk_css_provider_new();
  GdkDisplay* display = gdk_display_get_default();
  gchar* path = "/com/example/app/css/style.css";
  gtk_css_provider_load_from_resource(provider, path);
  gtk_style_context_add_provider_for_display(display, (GtkStyleProvider*)provider, 600);
  gtk_widget_set_size_request(window, 854, 480);
  gtk_window_present((GtkWindow*)window);
}

int main(int argc, char* argv[]) {
  GtkApplication* application = gtk_application_new("com.example.app", 0);
  g_resources_register(gresources_get_resource());
  g_signal_connect(application, "activate", (GCallback)activate, NULL);
  g_application_run((GApplication*)application, argc, argv);
  g_object_unref(application);
  return 0;
}

gresources.xml(资源配置文件)

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/com/example/app/css">
    <file>css/style.css</file>
  </gresource>
</gresources>

编译命令

glib-compile-resources --generate-source gresources.xml
gcc $(pkg-config --cflags gtk4) main.c gresources.c -o main $(pkg-config --libs gtk4)

错误原因

资源路径不匹配:gresources.xml中prefix="/com/example/app/css"与file="css/style.css"组合后,生成的完整资源路径是**/com/example/app/css/css/style.css**,但代码中调用gtk_css_provider_load_from_resource时使用的路径是/com/example/app/css/style.css,两者不一致导致找不到资源。

解决方法

修改gresources.xml中的file路径,使其与代码中的资源路径匹配:

修改后的gresources.xml

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/com/example/app/css">
    <file>style.css</file>
  </gresource>
</gresources>

说明:prefix已经指定了资源的根路径/com/example/app/css,file只需填写相对于该前缀的文件路径即可,这里style.css直接放在与gresources.xml同目录的css文件夹下,所以去掉file前的css/,让资源路径与代码中调用的/com/example/app/css/style.css完全一致。

重新编译验证

执行以下命令重新生成资源文件并编译:

glib-compile-resources --generate-source gresources.xml
gcc $(pkg-config --cflags gtk4) main.c gresources.c -o main $(pkg-config --libs gtk4)

运行程序后,窗口会加载orchid背景色,不再出现资源不存在的警告。

内容的提问来源于stack exchange,提问作者Bret Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:23