对不起,我的英语不好 .
我正在通过以下文章学习gtk 3作为"helloworld" https://developer.gnome.org/gtk3/stable/gtk-getting-started.html
我的环境:
- Mac OS X 10.8.3
- XQuartz 2.7.4
- GTk 3.4.4
- i686-apple-darwin11-llvm-gcc-4.2
在我尝试将此函数作为绘图的信号处理程序调用之前,一切正常:
static gboolean configure_event_cb(GtkWidget* widget,GdkEventConfigure* event,gpointer data)
{
if(surface) cairo_surface_destroy(surface);
surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget),
CAIRO_CONTENT_COLOR,
gtk_widget_get_allocated_width(widget),
gtk_widget_get_allocated_height(widget));
//非对象类型.看做普通的struct. cairo看做类似Graphics的静态类.
cairo_t* cr = cairo_create(surface);
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
cairo_paint(cr);
cairo_destroy(cr);
return TRUE;
}
程序总是在其他函数中的“cairo_paint(cr)”或“cairo_fill”行中崩溃 . 这是callstack:
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: callq 0x100a761c1 ; _cairo_gstate_in_clip
0x100a72007: movl %eax, (%rbx)
0x100a72009: xorl %eax, %eax
0x100a7200b: addq $8, %rsp
0x100a7200f: popq %rbx
0x100a72010: popq %rbp
0x100a72011: ret
有人能帮助我吗?
2 回答
我怀疑由于调用
cairo_surface_destroy
导致内存损坏 . 你在哪里宣布surface
?在调用cairo_surface_destroy
之前你在哪里设置它?您确定它指向引用计数> 0的有效表面对象吗?我会尝试评论那条线,看看你是否仍然遇到了崩溃 . 你可能会有一些内存泄漏需要修复,但至少你会知道这是不是问题 .
我找到了答案 .
实际问题是,Cairo库未在运行时加载 . 线索是,当我试图用cairo绘制东西时,Xcode向我展示了msg:
error: address doesn't contain a section that points to a section in a object file
所以我通过添加 -L/usr/local/lib -lcairo 改变了我的gcc命令:
执行此操作后,它不再崩溃 . Howerver,我不知道哪种类型的库实际链接到可执行文件,共享库或静态库?为什么它不在运行时加载该库?