3

对不起,我的英语不好。

我正在按照这篇文章https://developer.gnome.org/gtk3/stable/gtk-getting-started.html学习 gtk+ 3 作为“helloworld”

我的环境:
* Mac OS X 10.8.3
* XQuartz 2.7.4
* GTk+ 3.4.4
* i686-apple-darwin11-llvm-gcc-4.2

在我尝试将此函数作为绘图的信号处理程序调用之前,一切正常:

静态 gboolean configure_event_cb(GtkWidget* 小部件,GdkEventConfigure* 事件,gpointer 数据)
{

    如果(表面)cairo_surface_destroy(表面);

    表面 = gdk_window_create_similar_surface(gtk_widget_get_window(widget),
                                                CAIRO_CONTENT_COLOR,
                                                gtk_widget_get_allocated_width(小部件),
                                                gtk_widget_get_allocated_height(widget));

    // 非对象类型。看做普通的结构。cairo 看做类似图形的静态类。
    cairo_t* cr = cairo_create(surface);

    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);

    cairo_paint(cr);

    cairo_destroy(cr);

    返回真;
}

程序总是在其他函数中的“cairo_paint(cr)”或“cairo_fill”行崩溃。这是调用堆栈:

libcairo.2.dylib`_cairo_default_context_in_clip:
0x100a71ff5:pushq %rbp
0x100a71ff6: movq %rsp, %rbp
0x100a71ff9:pushq %rbx
0x100a71ffa: pushq %rax
0x100a71ffb: movq %rsi, %rbx
0x100a71ffe: movq 40(%rdi), %rdi
0x100a72002:调用 0x100a761c1 ;_cairo_gstate_in_clip
0x100a72007: movl %eax, (%rbx)
0x100a72009: xorl %eax, %eax
0x100a7200b: addq $8, %rsp
0x100a7200f:popq %rbx
0x100a72010:popq %rbp
0x100a72011: 恢复    

有人可以帮我吗?

4

2 回答 2

1

我怀疑由于调用cairo_surface_destroy. 你在哪里声明surface?你在调用之前在哪里设置它cairo_surface_destroy?您确定它指向引用计数 > 0 的有效表面对象吗?

我会尝试评论那条线,看看你是否仍然遇到崩溃。那时您可能需要修复一些内存泄漏,但至少您会知道这是否是问题所在。

于 2013-05-16T12:35:25.587 回答
0

我找到了答案。

实际的问题是,Cairo 库没有在运行时加载。线索是当我尝试用 cairo 绘制某些东西时,Xcode 向我显示了以下消息:
错误:地址不包含指向目标文件中某个部分的部分

所以我通过添加 -L/usr/local/lib -lcairo更改了我的 gcc 命令:

/usr/bin/gcc -Wall ./*.c -L/usr/local/lib -lcairopkg-config --cflags --libs gtk+-3.0

完成此操作后,它不再崩溃。但是,我不知道哪种类型的库实际上链接到可执行、共享或静态库?为什么它不在运行时加载该库?

于 2013-05-16T22:11:59.557 回答