抱歉我的英语不好。
通过阅读本文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
在我尝试将此函数作为绘图的信号处理程序调用之前,一切正常:
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
有人能帮助我吗?
答案 0 :(得分:1)
我怀疑由于调用cairo_surface_destroy
导致内存损坏。你在哪里宣布surface
?在致电cairo_surface_destroy
之前你在哪里设置它?你确定它指向一个引用计数>的有效表面对象吗? 0?
我会尝试评论该行,看看你是否仍然遇到崩溃。你可能会有一些内存泄漏需要修复,但至少你会知道这是不是问题。
答案 1 :(得分:0)
我找到了答案。
实际问题是,Cairo库未在运行时加载。线索是,当我试图用cairo绘制东西时,Xcode向我展示了msg:
错误:地址不包含指向目标文件中某个部分的部分
所以我通过添加 -L / usr / local / lib -lcairo 来改变我的gcc命令:
/ usr / bin / gcc -Wall ./*.c -L / usr / local / lib -lcairo
pkg-config --cflags --libs gtk+-3.0
执行此操作后,它不再崩溃。 Howerver,我不知道哪种类型的库实际上链接到可执行文件,共享库或静态库?为什么不在运行时加载该库?