如何编译基本的D-Bus / glib示例?

时间:2013-01-10 17:09:28

标签: c compilation glib dbus

我正在尝试学习如何使用带有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’
...

我是否错过了教程中的一点?不,请你帮我编译这段代码?

提前致谢。

5 个答案:

答案 0 :(得分:17)

像这样的教程通常假设你对它所编写的语言有一定的了解,在本例中是C,以及你将在其上运行的操作系统。

查看教程,我发现它只包含main函数。因此,您需要添加适当的#include指令才能使其正常工作:

#include <stdlib.h>          // for exit()   
#include <dbus/dbus.h>       // for dbus_*   
#include <dbus/dbus-glib.h>  // for dbus_g_*

此外,您需要编译库(在本例中为dbusdbus-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’