gtk +在调用任何cairo绘图函数时崩溃

时间:2013-05-16 05:26:01

标签: c macos gtk x11

抱歉我的英语不好。

通过阅读本文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    

有人能帮助我吗?

2 个答案:

答案 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,我不知道哪种类型的库实际上链接到可执行文件,共享库或静态库?为什么不在运行时加载该库?