我正在尝试在我的GTK 2.0应用程序中实现问题How to create a cairo_t on a Gtk 2 window的建议,我对结果感到困惑。错误输出是
planes_view.c: In function ‘draw_lines_planes’:
planes_view.c:145:33: warning: passing argument 1 of ‘gdk_cairo_create’ from incompatible pointer type [enabled by default]
cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));
^
In file included from /usr/include/gtk-2.0/gdk/gdk.h:33:0,
from /usr/include/gtk-2.0/gtk/gtk.h:32,
from planes_view.h:35,
from planes_view.c:34:
/usr/include/gtk-2.0/gdk/gdkcairo.h:33:10: note: expected ‘struct GdkDrawable *’ but argument is of type ‘struct GdkDrawable *’
cairo_t *gdk_cairo_create (GdkDrawable *drawable);
^
请注意,两种冲突类型是相同的。怎么会这样?也许有两个同名的类型?即便如此,我也需要知道如何做到这一点。
违规行最初是
cr = gdk_cairo_create(view->drawing_area);
并且投诉是绘图区域的声明类型是GtkWidget *,所以我尝试了正常的类型转换:
cr = gdk_cairo_create((struct GdkDrawable *)(view->drawing_area));
结果如上所示。
答案 0 :(得分:1)
信任编译器。 struct GdkDrawable *
与GdkDrawable *
不同。 GdkDrawable
已经是结构的typedef:
typedef struct _GdkDrawable GdkDrawable;
正如jku所说,你搞砸了。 gdk_cairo_create
需要一个GdkDrawable
,而您正尝试将其提供给GtkWidget。您的GdkDrawable
GdkWindow
是存储在GtkWidget
(window
成员)中的gtk_widget_get_window
,您可以使用{{1}}进行访问。
答案 1 :(得分:0)
我会说你有符号的不兼容定义,或者你以某种方式编译这个符号几次。检查符号的可见性。