2011-04-22 108 views
6

我想在Ubuntu上编译一个C程序,带有这些头文件:http://pastebin.com/SppCXb0U。起初我没有任何运气,而是阅读有关pkg配置后,我制作的这条线:用dbus头文件编译C程序

gcc `pkg-config --cflags --libs dbus-1` `pkg-config --cflags --libs glib-2.0` signals-tutorial.c 

但是,它仍然无法正常工作,给我这个错误:

/tmp/cc3BkbdA.o: In function `filter_example': 
signals-tutorial.c:(.text+0x1a3): undefined reference to `dbus_connection_setup_with_g_main' 
/tmp/cc3BkbdA.o: In function `proxy_example': 
signals-tutorial.c:(.text+0x29a): undefined reference to `g_type_init' 
signals-tutorial.c:(.text+0x2b3): undefined reference to `dbus_g_bus_get' 
signals-tutorial.c:(.text+0x323): undefined reference to `dbus_g_proxy_new_for_name' 
signals-tutorial.c:(.text+0x369): undefined reference to `dbus_g_proxy_add_signal' 
signals-tutorial.c:(.text+0x38a): undefined reference to `dbus_g_proxy_connect_signal' 
collect2: ld returned 1 exit status 

我不知道该从这里做什么。

==================================

一个很好的解释 - 谢谢你。但是,我无法得到它的工作。在上面运行你的命令(添加一个)会产生以下结果

gcc `pkg-config --cflags dbus-1` \ 
>  `pkg-config --cflags glib-2.0` \ 
>  signals-tutorial.c \ 
>  `pkg-config --libs dbus-1` \ 
>  `pkg-config --libs glib-2.0` 
/tmp/ccjN0QMh.o: In function `filter_example': 
signals-tutorial.c:(.text+0x1a3): undefined reference to `dbus_connection_setup_with_g_main' 
/tmp/ccjN0QMh.o: In function `proxy_example': 
signals-tutorial.c:(.text+0x29a): undefined reference to `g_type_init' 
signals-tutorial.c:(.text+0x2b3): undefined reference to `dbus_g_bus_get' 
signals-tutorial.c:(.text+0x323): undefined reference to `dbus_g_proxy_new_for_name' 
signals-tutorial.c:(.text+0x369): undefined reference to `dbus_g_proxy_add_signal' 
signals-tutorial.c:(.text+0x38a): undefined reference to `dbus_g_proxy_connect_signal' 
collect2: ld returned 1 exit status 

回答

12

你的问题不在头文件中,你的问题是在库中;关于“未定义参考”的投诉通常来自链接器。你需要把磁带库配置选项后的源文件:

gcc `pkg-config --cflags dbus-glib-1` \ 
    `pkg-config --cflags dbus-1` \ 
    `pkg-config --cflags glib-2.0` \ 
    signals-tutorial.c \ 
    `pkg-config --libs dbus-glib-1` \ 
    `pkg-config --libs dbus-1` \ 
    `pkg-config --libs glib-2.0` 

--libs选项会产生一系列的-l国旗的编译器,编译器将这些信息传递给链接器。链接器将从目标文件开始从左向右解析符号(或者,在本例中,C源文件足够接近),因此所有库-l开关都需要关注源文件。

+0

非常感谢您的回答。评论字段不够大,无法发布我的结果,因此我将其粘贴在主帖子中。 – 2011-04-22 01:26:27

+0

'pkg-config --libs dbus-1'和'pkg-config --libs glib-2.0'输出是什么? – 2011-04-22 01:32:00

+0

'-L/usr/lib/x86_64-linux-gnu -ldbus-1 -lpthread -lrt'和'-L/usr/lib/x86_64-linux-gnu -lglib-2.0'分别为 – 2011-04-22 01:35:18