2010-01-30 118 views
1

我有下面的C GTK +代码,我碰到下面的错误尝试编译:未定义参考gdk_pixbuf_new_from_file_utf8

未定义参考gdk_pixbuf_new_from_file_utf8

代码:

#include <stdlib.h> 
#include <gtk/gtk.h> 

GdkPixbuf *create_pixbuf(const gchar *filename) 
{ 
    GdkPixbuf *pixbuf; 
    GError *error = NULL; 
    pixbuf = gdk_pixbuf_new_from_file(filename, &error); 
    if (!pixbuf) 
    { 
     fprintf(stderr, "%s\n", error->message); 
     g_error_free(error); 
    } 

    return pixbuf; 
} 

int main (int argc, char *argv[]) 
{ 

    GtkWidget *window; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window), "Center"); 
    gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("someimg.jpg")); 
    gtk_widget_show(window); 

    g_signal_connect_swapped(G_OBJECT(window), "destroy", 
     G_CALLBACK(gtk_main_quit), NULL); 

    gtk_main(); 

    return 0; 
} 

任何人都可以告诉我什么是错的?

回答

2

gdk_pixbuf_new_from_filegtk-2.0/gdk-pixbuf/gdk-pixbuf-core.h

定义,但不是直接包括文件,它看起来像GDK-pixbuf的图书馆希望你仅使用一个头的所有功能。尝试添加以下行:(。gdk_pixbuf_new_from_file是一个预处理宏它只是用作gdk_pixbuf_new_from_file_utf8别名这就是为什么错误信息显示不同的函数名比你实际上是在你的代码示例中使用)

#include <gdk-pixbuf/gdk-pixbuf.h> 

+0

我已经做到了,但它仍然给我的错误...任何想法? – 2010-01-30 13:33:17

+1

'undefined reference'是一个链接器错误,您需要链接所有必需的库,使用pkg-config,如我所述。 – wich 2010-01-30 13:37:43

+0

但我不知道在Code :: Blocks中使用pgk-config来设置它的位置? – 2010-01-30 13:43:40

1

从来没有使用GTK,但2秒谷歌搜索建议,你需要添加:

#include <gdk-pixbuf/gdk-pixbuf.h> 

到文件的顶部。

添加以下两包括:

#include <glib/gerror.h> 
#include <gdk-pixbuf/gdk-pixbuf.h> 

而且编译:

gcc `pkg-config --cflags --libs gtk+-2.0` test.c -o test 

的pkg配置提供了以下输出

+0

发布答案,然后将其更改为复制某人在您之前发布的答案,充其量不敬。 – 2010-01-30 13:25:17

+0

我发布这个不知道上面的答案。我编辑它,因为我忘了将代码行包装在代码标签中。 – Jimmeh 2010-01-30 13:33:26

+0

其实你的答案是完全不同的,我可以张贴的截图,如果你喜欢... – 2010-01-30 13:43:06

4

执行以下操作后刚刚成功编译代码:

-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 

因此,你需要用下面的库链接:

  • GTK的x11-2.0
  • GDK-x11-2.0
  • ATK-1.0
  • GIO-2.0
  • pangoft2-1.0
  • gdk_pixbuf-2.0
  • pangocairo-1.0
  • 开罗
  • 的pango-1.0
  • freetype的
  • 的fontconfig
  • 的GObject-2.0
  • gmodule-2.0
  • 油嘴-2。0

如果您想尝试从gdk_pixbuf-2.0开始尝试,并且在链接时看到是否还有未定义的引用,您可以省略一些。

刚试过,似乎对你的代码GTK的x11-2.0和gdk_pixbuf-2.0就足够了。

快速谷歌似乎表明,在项目选项窗口中,你应该有一个连接选项卡,你可以列出应与您的代码链接的所有库。如果你不在linux/unix上,你可能需要一个不同的gtk库,因为gtk-x11-2.0特定于X Window系统。