编译BASIC“libnotify”代码时出错

时间:2010-02-24 21:57:04

标签: c linux gcc linker compiler-errors

#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;
}

编译代码会给我“未定义引用”错误:

shadyabhi@shadyabhi-desktop:~/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
shadyabhi@shadyabhi-desktop:~/c$

我从这个blog获取了代码。

2 个答案:

答案 0 :(得分:4)

听起来你忘了传递-lnotify实际链接到libnotify。

答案 1 :(得分:0)

我还不能发表评论,所以我将其作为答案发布。

在对已接受的问题的评论中,Abhijeet Rastogi询问如何知道gcc的论点应该是什么,而Ignacio Vazquez-Abrams正确地提到了pkg-config还有更多:

这个神奇的“-lnotify”是gcc链接器的“-l”标志,附加了你想要链接的库。查看/ usr / lib时,有一个名为libnotify.so的文件,并且使用“-lnotify”将此文件链接到程序中。 因此,要链接到库,请在/ usr / lib中搜索相应的库文件,记下文件名,删除“lib-”和文件扩展名,然后将其添加到“-l”-flag中。 请注意,链接顺序很重要,因此您必须在其依赖项之前包含依赖项。

现在,如果库中有.pc文件,可以使用像

这样的行
gcc `pkg-config --cflags --libs libnotify` main.c ...

构建程序。在我的系统上,对pkg-config的调用扩展为

-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的glib和gtk依赖。