Glib学习(27) dbus编译
最近想学习gdbus,gdbus是对dbus的一种封装,能够更好的使用dbus。DBUS是一种高级的进程间通信机制。DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信息转发到目的进程。DBUS后台进程充当着一个路由器的角色。DBUS中主要概念为总线,连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理。
https://blog.csdn.net/yishuige/article/details/52852531
这篇文章是介绍dbus的,可以不用看例程,看看基本概念。
研究gdbus开始时当然是他的库的编译,经过一番查找,发现gdbus是包含在glib的gio中,所以我们只需要编译出glib就可以正常使用gdbus了。
开始在网上找了个例程,经过编译之后想运行一下,看看效果,运行时总是进入GBusNameLostCallback,也就是无法获取总线名字,后来看了
https://blog.csdn.net/gxh9314/article/details/79093711?utm\_source=blogxgwz9
关于dbus的部署,发现gdbus功能实现需要dbus-daemon的支持。
这篇文章就讲一下我们如何编译、安装、部署dbus。
如果你的设备能够直接apt install 可以直接跳转到部署环节。
下载dbus源码
dbus官方网站
https://www.freedesktop.org/wiki/Software/dbus/
我使用的版本,下载网址
https://gitlab.freedesktop.org/dbus/dbus/-/tree/dbus-1.12
下载之后就是选择一个地方进行解压,准备进行编译。
tar xvf dbus-dbus-1.12.tar
cd dbus-dbus-1.12
编译 安装
当拿到一个开源代码时,我们可以先看一下他的readme,如果有install可以看一下,一般编译的方法都在这个文件中。
dbus提供了两种编译方式,autoconfig和cmake
两种方式得到的生成产物不同。
autoconfig会生成dbus.service和dbus.socket,并尝试安装到系统中。
但是他的可执行只有dbus-daemon
cmake中间过程生成文件统一放在一个文件夹中,比较整洁
可执行会生成更多的相关命令和测试命令,但是很可能这些东西不会用到。
而且不会生成dbus.service和dbus.socket。
我的建议是使用cmake编译,然后根据bus/dbus.service.in编写自己的service文件。
下面分别讲一下两个编译过程
./autogen.sh
./configure --prefix=/xxx
make
make install
其中—prefix=是可选的安装路径
编译完成后会输出一些关于安装的信息
ldflags: -Wl,--no-as-needed
64-bit int: long
32-bit int: int
16-bit int: short
Doxygen: /usr/bin/doxygen
xmlto: /usr/bin/xmlto
ducktype: no
yelp-build: no
Rebuilding generated files: yes
gcc coverage profiling: no
Building embedded tests: no
Building modular tests: auto
- with GLib: yes
Installing tests: no
Building verbose mode: no
Building assertions: no
Building checks: yes
Building bus stats API: yes
Building SELinux support: no
Building AppArmor support: no
Building inotify support: yes
Building kqueue support: no
Building systemd support: yes
Building X11 code: yes
Building Doxygen docs: yes
Building Ducktype docs: no
Building XML docs: yes
Building launchd support: no
System bus socket: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
System bus address: unix:path=/home/xxx/glibtest/gdbus/dbus/var/run/dbus/system_bus_socket
System bus PID file: /home/xxx/glibtest/gdbus/dbus/var/run/dbus/pid
Session bus listens on: unix:tmpdir=/tmp
Session clients connect to: autolaunch:
pam_console auth dir: (none)
Console owner file: no
Console owner file path:
System bus user: messagebus
Session bus services dir: /home/xxx/glibtest/gdbus/dbus/share/dbus-1/services
'make check' socket dir: /tmp
Libraries have been installed in:
/home/xxx/glibtest/gdbus/dbus/lib
/usr/bin/install: 无法删除'/lib/systemd/system/dbus.service': 权限不够
/usr/bin/install: 无法删除'/lib/systemd/system/dbus.socket': 权限不够
cmake编译
mkdir dbus-build-dir
cd dbus-build-dir
cmake -DCMAKE_INSTALL_PREFIX=/xxx ../cmake
make
make install
其中-DCMAKE_INSTALL_PREFIX=是可选的安装路径
到此就完成了dbus的编译和安装,在安装的路径下可以找到dbus-daemon,如果需要作为服务启动需要编写相应的.service文件。
部署
https://blog.csdn.net/gxh9314/article/details/79093711?utm\_source=blogxgwz9
这篇文章讲的很详细,主要就是
启动dbus-daemon
dbus-daemon --session --address=unix:path=/var/run/dbus/session_bus_socket &
设置环境变量
export DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket
路径必须存在,并且环境变量和启动参数必须一致,如果你是service启动可以在service文件中设置环境变量
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/var/run/dbus/session_bus_socket"
部署完成,下一篇贴上gdbus例程。
还没有评论,来说两句吧...