使用 dbus 头文件编译 C 程序

Posted

技术标签:

【中文标题】使用 dbus 头文件编译 C 程序【英文标题】:Compiling C program with dbus header files 【发布时间】:2011-08-10 17:05:15 【问题描述】:

我正在尝试在 Ubuntu 上编译带有以下标头的 C 程序:http://pastebin.com/SppCXb0U。起初我一点运气都没有,但在阅读了 pkg-config 之后,我制作了这行代码:

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

【问题讨论】:

【参考方案1】:

你的问题不在于头文件,你的问题在于库;关于“未定义的引用”的抱怨通常来自链接器。您需要将库配置选项放在 源文件之后:

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 开关都需要跟随您的源文件。

【讨论】:

非常感谢您的精彩回答。评论区不够大,无法发布我的结果,所以我将其粘贴在主帖中。 pkg-config --libs dbus-1pkg-config --libs glib-2.0 输出什么? -L/usr/lib/x86_64-linux-gnu -ldbus-1 -lpthread -lrt-L/usr/lib/x86_64-linux-gnu -lglib-2.0 分别 如果在 C 文件之前添加 pkg-config --cflags dbus-glib-1 并在之后添加 pkg-config --libs dbus-glib-1 会发生什么?他们可能应该在两个地方都在 dbus-1 之前,但你可能需要稍微调整一下顺序。我认为您可能需要的不仅仅是 dbus-1 和 glib-2.0 库。 @Martin:我用最终的dbus-glib-1 依赖更新了命令。

以上是关于使用 dbus 头文件编译 C 程序的主要内容,如果未能解决你的问题,请参考以下文章

C 头文件

为啥C程序多文件编译,没有导入自己的头文件也能正常编译通过?

如何解决gcc编译c程序找不到头文件的问题

23.头文件

arm-linux-gcc怎么编译自己写的头文件

C语言基础:头文件