我正在尝试学习如何使用带有C绑定的D-Bus。我以前从未使用过D-Bus。我正在关注这个tutorial,我认为这是官方的(Freedesktop.org)。我已经阅读了它,直到这个paragraph给出了第一个示例程序 ,但不幸的是,我在这个页面上没有看到任何关于如何编译它或包含哪些库的指示。我错过了什么吗?
我的操作系统是Ubuntu 10.04 32位。我安装了libdbus-glib-1-dev
包。我尝试在源文件的开头添加#include <dbus/dbus.h>
,并使用
$ gcc -ldbus-1 -I/usr/include/dbus-1.0/ -I/usr/lib/i386-linux-gnu/dbus-1.0/include -o my_dbus.bin my_dbus.c
但我一直都在失败:
my_dbus.c: In function ‘main’:
my_dbus.c:7:3: error: unknown type name ‘DBusGConnection’
my_dbus.c:8:3: error: unknown type name ‘GError’
...
我是否错过了教程中的一点?不,请你帮我编译这段代码?
提前致谢。
答案 0 :(得分:17)
像这样的教程通常假设你对它所编写的语言有一定的了解,在本例中是C,以及你将在其上运行的操作系统。
查看教程,我发现它只包含main
函数。因此,您需要添加适当的#include
指令才能使其正常工作:
#include <stdlib.h> // for exit()
#include <dbus/dbus.h> // for dbus_*
#include <dbus/dbus-glib.h> // for dbus_g_*
此外,您需要编译库(在本例中为dbus
和dbus-glib
),或使用操作系统中预编译的库,以便将它们链接到可执行文件。
您还需要随源提供的头文件或操作系统中的“开发”软件包。
例如,在我的Ubuntu工作站上,我可以安装源文件和头文件,如下所示:
sudo apt-get -y install dbus libdbus-1-dev libdbus-glib-1-2 libdbus-glib-1-dev
编译(或正确安装)后,继续编译程序。您需要指定正确的包含路径和库以链接到编译器/链接器。例如,使用GCC和我当前的设置,它将是:
gcc test.c -I/usr/include/dbus-1.0 \
-I/usr/lib/x86_64-linux-gnu/dbus-1.0/include \
-I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ \
-ldbus-1 \
-ldbus-glib-1
-Wall -Wextra
这应该在当前目录中创建一个执行a.out
。
当然,我有几年的C和Linux经验,所以我很容易弄清楚这些东西。如果你想从C开始,你可能应该从更简单的开始。
答案 1 :(得分:3)
基于'netcoder''回答是适用于我的程序。
#include <stdlib.h> // for exit()
#include <dbus/dbus.h> // for dbus_*
#include <dbus/dbus-glib.h> // for dbus_g_*
int
main (int argc, char **argv)
{
DBusGConnection *connection;
GError *error;
DBusGProxy *proxy;
char **name_list;
char **name_list_ptr;
g_type_init ();
error = NULL;
connection = dbus_g_bus_get (DBUS_BUS_SESSION,
&error);
if (connection == NULL)
{
g_printerr ("Failed to open connection to bus: %s\n",
error->message);
g_error_free (error);
exit (1);
}
/* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
proxy = dbus_g_proxy_new_for_name (connection,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
/* Call ListNames method, wait for reply */
error = NULL;
if (!dbus_g_proxy_call (proxy, "ListNames", &error, G_TYPE_INVALID,
G_TYPE_STRV, &name_list, G_TYPE_INVALID))
{
/* Just do demonstrate remote exceptions versus regular GError */
if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
g_printerr ("Caught remote method exception %s: %s",
dbus_g_error_get_name (error),
error->message);
else
g_printerr ("Error: %s\n", error->message);
g_error_free (error);
exit (1);
}
/* Print the results */
g_print ("Names on the message bus:\n");
for (name_list_ptr = name_list; *name_list_ptr; name_list_ptr++)
{
g_print (" %s\n", *name_list_ptr);
}
g_strfreev (name_list);
g_object_unref (proxy);
return 0;
}
和Makefile
file=1
sample:
g++ -g $(file).cc -o $(file) -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -ldbus-1 -ldbus-glib-1 -Wall -Wextra -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0
注意:此网页有一个很好的D-bus示例https://developer.gnome.org/gio//2.36/GDBusProxy.html
答案 2 :(得分:2)
您似乎必须单独添加<dbus/dbus-glib.h>
,因为它不会自动包含在<dbus.h>
答案 3 :(得分:2)
请注意,libdbus-glib已弃用,未维护,不应用于从C访问D-Bus:请改用GDBus。也不建议使用libdbus-1:它是维护的,但是使用D-Bus的API级别低得多,并且没有GDBus的所有便利功能。
正如热心人所说,有很好的GDBus documentation available。
(libdbus-glib和libdbus-1故意不联系,以免给他们谷歌汁。)
答案 4 :(得分:1)
基于gcc命令返回的错误。 gcc能够看到<dbus/dbus.h>
文件(否则它将显示错误消息,表明他无法看到头文件),但无法看到该文件中应存在的一些变量({{ 1}}和‘DBusGConnection’
)。可能是你没有使用适当版本的dbus
并尝试使用make文件而不是一个命令
‘GError’