我第一次尝试将 GResource 与主 C 代码链接起来,但遇到了严重的问题。这段代码就是问题出现的地方:
create_window(char *win_id)
{
char *p = g_strdup_printf("%s/%s", RESOURCE_PATH, win_id);
GtkWidget *win;
builder = gtk_builder_new_from_resource(p);
g_free(p);
win = GTK_WIDGET(gtk_builder_get_object(builder, win_id));
g_object_unref(G_OBJECT(builder));
return win;
}
程序的输出是:
(process:946): Gtk-CRITICAL **: 22:01:37.141: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
(process:946): Gtk-CRITICAL **: 22:01:37.141: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
Segmentation fault
运行
gdb
中的程序,我发现错误发生在builder = gtk_builder_new_from_resource(p);
此时的回溯是:
#1 0x00007ffff7725304 in () at /usr/lib64/libgtk-3.so.0
#2 0x00007ffff7745c38 in () at /usr/lib64/libgtk-3.so.0
#3 0x00007ffff7730bcc in () at /usr/lib64/libgtk-3.so.0
#4 0x00007ffff7745b26 in () at /usr/lib64/libgtk-3.so.0
#5 0x00007ffff7731512 in () at /usr/lib64/libgtk-3.so.0
#6 0x00007ffff7f45b33 in g_type_create_instance ()
at /usr/lib64/libgobject-2.0.so.0
#7 0x00007ffff7f2a700 in () at /usr/lib64/libgobject-2.0.so.0
#8 0x00007ffff7f2bc0c in g_object_new_with_properties ()
at /usr/lib64/libgobject-2.0.so.0
#9 0x00007ffff7f2c7c1 in g_object_new () at /usr/lib64/libgobject-2.0.so.0
#10 0x00007ffff774de8a in () at /usr/lib64/libgtk-3.so.0
#11 0x00007ffff792306d in () at /usr/lib64/libgtk-3.so.0
#12 0x00007ffff7f45b33 in g_type_create_instance ()
at /usr/lib64/libgobject-2.0.so.0
#13 0x00007ffff7f2a700 in () at /usr/lib64/libgobject-2.0.so.0
#14 0x00007ffff7f2bf6c in g_object_newv () at /usr/lib64/libgobject-2.0.so.0
#15 0x00007ffff76d7c44 in () at /usr/lib64/libgtk-3.so.0
#16 0x00007ffff76d9015 in () at /usr/lib64/libgtk-3.so.0
#17 0x00007ffff76d9e97 in () at /usr/lib64/libgtk-3.so.0
#18 0x00007ffff7e2f290 in () at /usr/lib64/libglib-2.0.so.0
#19 0x00007ffff7e30785 in g_markup_parse_context_parse ()
at /usr/lib64/libglib-2.0.so.0
#20 0x00007ffff76daeb6 in () at /usr/lib64/libgtk-3.so.0
#21 0x00007ffff76d529c in gtk_builder_add_from_resource ()
at /usr/lib64/libgtk-3.so.0
#22 0x00007ffff76d873a in gtk_builder_new_from_resource ()
at /usr/lib64/libgtk-3.so.0
#23 0x0000000000401296 in create_window (win_id=0x40204b "farma.ui")
at ../src/main.c:33
#24 0x000000000040132e in main (argc=1, argv=0x7fffffffde98) at ../src/main.c:49
(gdb)
每次我都会在
dmesg
中收到一条消息:
Code: 00 00 4c 89 f7 e8 90 87 e1 ff 4c 89 ff e8 c8 be e1 ff 48 83 c4 18 5b 5d 41 5c 41 5d 41 5e 41 5f c3 66 0f 1f 84 00 00 00 00 00 <48> 8b 47 18 48 8b 40 10 c3 0f 1f 80 00 00 00 00 53 48 8b 5f 18 48
我发现了一些对此错误的引用,但在我使用它的上下文中没有一个引用,并且没有一个(即使是那些标记为“已解决”的)实际指示出了什么问题。大多数人似乎使用 libglibmm (我不使用)。所有报告的错误都有 3 行 - 就像我的例子一样。
进入代码,我看到参数
p
是'/com/jcoppens/farma/farma.ui',这是正确的。
(S)进入下一个代码行会产生错误。
我正在运行 Slackware64 15.0、glibmm2.64.5(我的代码中未使用)、gcc 12.2.0、内核 5.19.17
问题似乎是我正在加载的 ui 称为几个 XPM,它们必须单独加载并作为“从资源”而不是“从文件”导入。 “似乎”,因为错误消息似乎根本没有指向那种错误。不过,现在它可以工作了...
我只是想让 gtk 在树莓派操作系统上工作。一切都会编译和构建,但像你一样,我在运行代码时收到相同的错误消息。 当这一行执行时: gtk_window_new(GTK_WINDOW_TOPLEVEL);
如果您能详细说明一下您的答案,我将非常感激。我不知道 XPM 是什么,谷歌正在推出房地产 proteries 哈哈。另外,您能否展示一下您在代码或构建设置中更改的内容。