2010-02-24 80 views
1
#include <libnotify/notify.h> 
#include <glib.h> 
#include <unistd.h> 
int main(int argc, char** argv) 
{ 
    if(argc == 3) 
    { 
     NotifyNotification *n; 
     notify_init("Test"); 
     n = notify_notification_new (argv[1],argv[2], NULL, NULL); 
     notify_notification_set_timeout (n, 3000); //3 seconds 
     if (!notify_notification_show (n, NULL)) { 
      g_error("Failed to send notification.\n"); 
      return 1; 
     } 
     g_object_unref(G_OBJECT(n)); 
    }else{ 
     g_print("Too few arguments (%d), 2 needed.\n", argc-1); 
    } 
    return 0; 
} 

編譯代碼給我「未定義的引用」錯誤:錯誤編譯BASIC 「libnotify」 代碼

[email protected]:~/c$ gcc -Wall -o test libnotify.c `pkg-config --libs --cflags glib-2.0 gtk+-2.0` 
/tmp/ccA2Q6xX.o: In function `main': 
libnotify.c:(.text+0x20): undefined reference to `notify_init' 
libnotify.c:(.text+0x4b): undefined reference to `notify_notification_new' 
libnotify.c:(.text+0x60): undefined reference to `notify_notification_set_timeout' 
libnotify.c:(.text+0x71): undefined reference to `notify_notification_show' 
collect2: ld returned 1 exit status 
[email protected]:~/c$ 

我把代碼從這個blog

回答

4

聽起來像你忘了通過-lnotify實際上鍊接到libnotify。

+0

好的。 thanx..Perfect。但是,我怎麼知道我必須將「-lnotify」作爲參數傳遞給gcc?我的意思是確切的名字。 – 2010-02-24 22:15:04

+0

如果一個庫帶有'.pc'文件,你可以查詢'pkg-config'來找出你需要傳遞什麼參數。 – 2010-02-24 22:25:27

0

我還不能評論,所以我張貼這個答案。

在已接受的問題進行評論,Abhijeet Rastogi問怎麼知道參數GCC應該是什麼,雖然伊格納西奧巴斯克斯 - 艾布拉姆斯正確提到pkg配置有多種:

這片神奇的「-lnotify 「是gcc的鏈接器的」-l「標誌,它附加了你想鏈接到的庫。在/ usr/lib中查看時,有一個名爲libnotify.so的文件,並且「-lnotify」文件被鏈接到程序中。 因此,要鏈接到庫,請搜索/ usr/lib中的相應庫文件,記下文件名,刪除「lib-」和文件擴展名並將其添加到「-l」標記。 請注意,鏈接順序很重要,因此您必須在依賴項之前包含依賴項。

現在,如果有一個庫中的文件.PC,可以使用如下一行

gcc `pkg-config --cflags --libs libnotify` main.c ... 

籌建方案。在我的系統中,調用pkg配置擴展到

-pthread -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lnotify -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 

所以沒有必要與libnotify的油嘴和GTK依賴明確處理。