ccbbcc 2024-06-15 21:39 采纳率: 91.6%
浏览 1

D-Bus的用例的问题

dbus-ding-send.c:

#include <glib.h>                                // 包含glib库
#include <dbus/dbus-glib.h>                        // 包含glib库中D-BUS管理库
#include <stdio.h>
static gboolean send_ding(DBusConnection *bus);        // 定义发送消息函数的原型

int main ()
{
   GMainLoop *loop;                            // 定一个事件循环对象的指针
   DBusConnection *bus;                            // 定义总线连接对象的指针
   DBusError error;                                // 定义D-BUS错误消息对象
   loop = g_main_loop_new(NULL, FALSE);            // 创建新事件循环对象
   dbus_error_init (&error);                        // 将错误消息对象连接到D-BUS错误消息对象
   bus = dbus_bus_get(DBUS_BUS_SESSION, &error);    // 连接到总线
   if (!bus) {                                    // 判断是否连接错误
      g_warning("连接到D-BUS失败: %s", error.message); // 使用GLib输出错误警告信息
      dbus_error_free(&error);                        // 清除错误消息
      return 1;
   }
   dbus_connection_setup_with_g_main(bus, NULL);    // 将总线设为接收GLib事件循环
   g_timeout_add(1000, (GSourceFunc)send_ding, bus);    // 每隔1000ms调用一次send_ding()函数,
                                            // 将总线指针作为参数
   g_main_loop_run(loop);                        // 启动事件循环
   return 0;
}
static gboolean send_ding(DBusConnection *bus)        // 定义发送消息函数的细节
{
   DBusMessage *message;                        // 创建消息对象指针
   message = dbus_message_new_signal("/com/burtonini/dbus/ding", 
                                       "com.burtonini.dbus.Signal",
                                       "ding");        // 创建消息对象并标识路径
   dbus_message_append_args(message,
                            DBUS_TYPE_STRING, "ding!",
                            DBUS_TYPE_INVALID);    // 将字符串“Ding!”定义为消息
   dbus_connection_send(bus, message, NULL);        // 发送该消息
   dbus_message_unref(message);                    // 释放消息对象
   g_print("ding!\n");                                // 该函数等同与标准输入输出库的printf()
   return TRUE;
}


dbus-ding-listen.c;

#include <glib.h>                                // 包含glib库
#include <dbus/dbus-glib.h>                        // 包含glib库中D-BUS管理库
static DBusHandlerResult signal_filter                 // 定义接收消息函数的原型
      (DBusConnection *connection, DBusMessage *message, void *user_data);
      
int main()
{
   GMainLoop *loop;                            // 定一个事件循环对象的指针
   DBusConnection *bus;                            // 定义总线连接对象的指针
   DBusError error;                                // 定义D-BUS错误消息对象
   loop = g_main_loop_new(NULL, FALSE);            // 创建新事件循环对象
   dbus_error_init(&error);                        // 将错误消息对象连接到D-BUS错误消息对象
   bus = dbus_bus_get(DBUS_BUS_SESSION, &error);    // 连接到总线
   if (!bus) {                                    // 判断是否连接错误
      g_warning("连接到D-BUS失败: %s", error.message); // 使用GLib输出错误警告信息
      dbus_error_free(&error);                        // 清除错误消息
      return 1;
  }
   dbus_connection_setup_with_g_main(bus, NULL);    // 将总线设为接收GLib事件循环
   dbus_bus_add_match(bus, "type='signal',interface='com.burtonini.dbus.Signal'");    // 定义匹配器
   dbus_connection_add_filter(bus, signal_filter, loop, NULL);    // 调用函数接收消息
   g_main_loop_run(loop);                            // 启动事件循环
   return 0;
}
static DBusHandlerResult                            // 定义接收消息函数的细节
signal_filter (DBusConnection *connection, DBusMessage *message, void *user_data)
{
   GMainLoop *loop = user_data;                    // 定义事件循环对象的指针,并与主函数中的同步
   if (dbus_message_is_signal                     // 接收连接成功消息,判断是否连接失败
        (message, DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, "Disconnected")) {
      g_main_loop_quit (loop);                    // 退出主循环
      return DBUS_HANDLER_RESULT_HANDLED;
   }
   if (dbus_message_is_signal(message, "com.burtonini.dbus.Signal", "Ping")) {
                                            // 指定消息对象路径,判断是否成功
      DBusError error;                            // 定义错误对象
      char *s;
      dbus_error_init(&error);                        // 将错误消息对象连接到D-BUS错误消息对象
      if (dbus_message_get_args                     // 接收消息,并判断是否有错误
         (message, &error, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID)) {
         g_print("接收到的消息是: %s\n", s);            // 输出接收到的消息
         dbus_free (s);                            // 清除该消息
      } 
      else {                                    // 有错误时执行下列语句
         g_print("消息已收到,但有错误提示: %s\n", error.message);
         dbus_error_free (&error);
      }
      return DBUS_HANDLER_RESULT_HANDLED;
   }
   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


编译出错

img


请问,如何解决?谢谢!

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-15 21:39
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的信息来看,编译出错是因为系统未能找到glib.h头文件,这通常意味着GLib库没有正确安装在你的系统上。GLib是Gnome项目的一部分,提供了跨平台的基础C语言功能,包括类型系统、内存管理工具、基本数据结构、事件循环抽象、异步方法以及方便的杂项实用程序。D-Bus绑定通常依赖于GLib库。

    为了解决这个问题,你需要在系统中安装GLib库。在Ubuntu或类似的Linux发行版中,可以通过运行以下命令来安装GLib开发库:

    sudo apt-get update
    sudo apt-get install libglib2.0-dev
    

    一旦安装了libglib2.0-dev包,你应该能够编译你的代码而不会遇到找不到glib.h的错误。

    另外,你提到的pkg-config --cflags --libs dbus-1命令似乎被错误地粘贴到了你的编译命令中。正确的编译命令应该不包含这部分,而是应该像这样:

    gcc dbus-ding-send.c -o ccb1 `pkg-config --cflags --libs dbus-1`
    

    或者,为了更清晰,可以分开写:

    CFLAGS=`pkg-config --cflags dbus-1`
    LIBS=`pkg-config --libs dbus-1`
    gcc dbus-ding-send.c -o ccb1 $CFLAGS $LIBS
    

    这样,pkg-config会为你提供正确的编译标志和链接器标志,确保你的程序可以正确地链接到D-Bus库。

    按照以上步骤操作后,你应该能够成功编译你的D-Bus示例代码。如果还有其他编译错误,可能需要检查你的D-Bus库是否也已经正确安装。通常,安装libdbus-1-dev包应该足够了:

    sudo apt-get install libdbus-1-dev
    

    完成这些步骤后,重新尝试编译你的代码,应该可以解决当前的编译错误。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月15日

悬赏问题

  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战
  • ¥15 svpwm波形异常求解答
  • ¥15 STM32——硬件IIC从机通信代码实现