使用dbus头文件编译C程序

Mar*_*sen 7 c linker dbus compilation pkg-config

我正在尝试使用这些头文件编译一个C程序:http://pastebin.com/SppCXb0U,在Ubuntu上.起初我根本没有任何运气,但在阅读了pkg-config之后我制作了这一行:

gcc `pkg-config --cflags --libs dbus-1` `pkg-config --cflags --libs glib-2.0` signals-tutorial.c
Run Code Online (Sandbox Code Playgroud)

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

/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
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做.

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

一个很好的解释 - 谢谢.但是,我无法让它发挥作用.在上面运行您的命令(添加)会产生以下结果

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
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 13

您的问题不在于头文件,您的问题在于库; 关于"未定义的引用"的抱怨通常来自链接器.你需要把磁带库配置选项后,源文件:

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`
Run Code Online (Sandbox Code Playgroud)

--libs选项将为-l编译器生成一系列标志,编译器会将这些标志传递给链接器.链接器将从目标文件开始从左到右解析符号(或者,在这种情况下,C源文件足够接近),因此所有库-l开关都需要遵循源文件.

  • 如果你在你的C文件和`pkg-config --libs dbus-glib-1`之后添加`pkg-config --cflags dbus-glib-1`会发生什么?他们应该在两个地方都可以使用dbus-1,但你可能需要稍微玩一下这个命令.我想你可能需要的不仅仅是dbus-1和glib-2.0库. (3认同)