首页 文章

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

提问于
浏览
2

对不起,我的英语不好 .

我正在通过以下文章学习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 回答

  • 0

    我怀疑由于调用 cairo_surface_destroy 导致内存损坏 . 你在哪里宣布 surface ?在调用 cairo_surface_destroy 之前你在哪里设置它?您确定它指向引用计数> 0的有效表面对象吗?

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

  • 1

    我找到了答案 .

    实际问题是,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命令:

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

    执行此操作后,它不再崩溃 . Howerver,我不知道哪种类型的库实际链接到可执行文件,共享库或静态库?为什么它不在运行时加载该库?

相关问题