Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gtk&x2B;调用任何cairo绘图函数时崩溃_C_Macos_Gtk_X11 - Fatal编程技术网

gtk&x2B;调用任何cairo绘图函数时崩溃

gtk&x2B;调用任何cairo绘图函数时崩溃,c,macos,gtk,x11,C,Macos,Gtk,X11,对不起,我的英语不好 通过本文,我将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) {

对不起,我的英语不好

通过本文,我将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; } 静态gboolean配置事件cb(GtkWidget*小部件、GdkEventConfigure*事件、gpointer数据) { 如果(表面)损坏(表面); 曲面=gdk_窗口_创建_相似_曲面(gtk_小部件_获取_窗口(小部件)), 开罗(内容)(颜色),, gtk_小部件_获取_分配的_宽度(小部件), gtk_小部件_获取_分配_高度(小部件)); //非对象类型.看做普通的开罗结构看做类似绘图的静态类. cairo_t*cr=cairo_创建(曲面); cairo_set_source_rgb(cr,1.0,1.0,1.0); 开罗漆(cr); 开罗大学(cr); 返回TRUE; } 程序总是在其他函数的“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: 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 libcairo.2.dylib`\u cairo\u默认\u上下文\u在\u剪辑中: 0x100a71ff5:pushq%rbp 0x100a71ff6:movq%rsp,%rbp 0x100a71ff9:pushq%rbx 0x100a71ffa:pushq%rax 0x100a71ffb:movq%rsi,%rbx 0x100A71FE:movq 40(%rdi),%rdi 0x100A7202: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
有人能帮我吗?

我怀疑内存损坏是由于调用了
cairo\u surface\u destroy
。您在哪里声明
曲面
?在调用
cairo\u surface\u destroy
之前,您在哪里设置它?是否确定它指向引用计数>0的有效曲面对象

我会试着把这句话说出来,看看你是否仍然会崩溃。您可能会有一些内存泄漏需要修复,但至少您会知道这是否是问题所在。

我找到了答案

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

因此,我通过添加-L/usr/local/lib-lcairo

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


这样做之后,它就不再崩溃了。然而,我不知道哪种类型的库实际上链接到可执行库,共享库还是静态库?为什么它不在运行时加载该库?

谢谢@gcbenison。我将surface变量声明为static global,与该教程所做的一样。实际上,即使我处理了该教程中的所有原始代码进行测试,它也崩溃了。销毁函数似乎不是问题:-(。