断言“GTK_IS_STYLE_PROVIDER_PRIVATE(提供商)”失败

问题描述 投票:0回答:1

我第一次尝试将 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,它们必须单独加载并作为“从资源”而不是“从文件”导入。 “似乎”,因为错误消息似乎根本没有指向那种错误。不过,现在它可以工作了...

c segmentation-fault resources gtk3
1个回答
0
投票

我只是想让 gtk 在树莓派操作系统上工作。一切都会编译和构建,但像你一样,我在运行代码时收到相同的错误消息。 当这一行执行时: gtk_window_new(GTK_WINDOW_TOPLEVEL);

如果您能详细说明一下您的答案,我将非常感激。我不知道 XPM 是什么,谷歌正在推出房地产 proteries 哈哈。另外,您能否展示一下您在代码或构建设置中更改的内容。

© www.soinside.com 2019 - 2024. All rights reserved.