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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章