2010-01-30 116 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系統。