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例程。

你可能感兴趣的:(glib)