【问题标题】:How to compile a basic D-Bus/glib example?如何编译一个基本的 D-Bus/glib 示例?
【发布时间】:2012-12-25 03:54:57
【问题描述】:

我正在尝试学习如何将 D-Bus 与 C 绑定一起使用。我以前从未使用过 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’
...

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

提前致谢。

【问题讨论】:

    标签: c compilation glib dbus


    【解决方案1】:

    像这样的教程通常假设您对编写它的语言(在本例中为 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 开始,你可能应该从更简单的开始。

    【讨论】:

    • 感谢您的帮助。这让我意识到我实际上问错了问题。我应该清楚地告诉它不是关于 C 的。无论如何,你的答案是如此完整,我得到了我的答案,我相信它会帮助其他人,所以谢谢 :)
    • 关于如何在 Eclipse 中执行此操作的任何建议? -I 指令进入项目属性 c/c++ General |路径和符号 |包括,但我看不到包含 -l 指令的方法??我的 dbus 安装没有附带任何要包含的库???
    【解决方案2】:

    请注意,libdbus-glib 已弃用、未维护,不应用于从 C 访问 D-Bus:请改用 GDBus。也不推荐使用 libdbus-1:它已被维护,但它是用于使用 D-Bus 的低级 API,并且不具备 GDBus 的所有便利功能。

    正如热心的极客所说,GDBus documentation available 很好。

    (libdbus-glib 和 libdbus-1 故意不链接以避免给他们 google 汁。)

    【讨论】:

      【解决方案3】:

      基于 'netcoder's' 的答案是适合我的程序。

      #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;
      }
      

      和生成文件

      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

      【讨论】:

        【解决方案4】:

        看来您必须单独包含&lt;dbus/dbus-glib.h&gt;,因为&lt;dbus.h&gt; 不会自动包含它

        【讨论】:

          【解决方案5】:

          根据您的 gcc 命令返回的错误。 gcc 能够看到&lt;dbus/dbus.h&gt; 文件(否则会显示错误消息,表明他无法看到头文件)但无法看到该文件中应该存在的一些变量(‘DBusGConnection’‘GError’) 。可能是你没有使用足够的 dbus 版本

          并尝试使用 make 文件而不是一个命令

          LDFLAGS+=-ldbus
          CFLAGS+=-I/usr/include/dbus-1.0/
          CFLAGS+=-I/usr/lib/i386-linux-gnu/dbus-1.0/include
          
          
          all: dbus-example.bin
          
          
          %.o: %.c
              $(CC) $(CFLAGS) -c -o $@ $^
          
          dbus-example.bin: my_dbus.o
              $(CC) $(LDFLAGS) -o $@ $^
          
          clean:
              rm -f *.o dbus-example.bin
          

          【讨论】:

          • 对不起,写这个问题时只是复制过去的错误,我的错。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-09
          • 2016-03-06
          • 2013-10-20
          • 1970-01-01
          相关资源
          最近更新 更多