文章目录
- 参考资料
- 配置环境
- cmake
- libsigc++
- dbus-cxx
- 例程
- server.cpp
- client.cpp
- Makefile
- 运行结果
此帖作为自己学习记录使用,尚未使用交叉编译,仅在本地使用
参考资料
需先了解DBUS基础知识,建议看DBUS官方文档
DBUS-CXX也是建议看官方文档,各个配置环境也先仔细看对应的文档再操作
DBUS-CXX的中文资料较少,耐心看完官方文档
dbus-cxx: dbus-cxx Library
[C++]:libsigc++ programming @ 玄根白丁的部落格
配置环境
需先配置好dbus环境,可参考上一篇博客
具体版本
ligsigc++ 3.0.0
dbus-cxx-2.0
cmake
- 检查自己是否有cmake并且版本是否大于3.12,若都无,从该网站下载cmake源码
- 解压cmake 源码,之后进入cmake目录执行
sudo ./configure
,然后执行sudo make && make install
libsigc++
从官方文档中可以看到,从压缩包build比git出来的项目更容易,git出来在make的时候会遇到错误
-
sudo apt-get install mm-common
下载 mm-common -
下载源码
wget https://download.gnome.org/sources/libsigc++/3.0/libsigc%2B%2B-3.0.0.tar.xz
这边选择3.0.0版本,3.2版本利用autotools编译会出现问题,暂时未找到解决方法
-
执行
mkdir __install
-
解压之后执行
./configure --prefix=$PWD/__install
,如果是交叉编译,需要加上--host=xxxx
-
make && make install
-
可以看见在__install 下面生成了如下目录,对应着头文件,库文件
dbus-cxx
- 下载源码
git clone https://github.com/dbus-cxx/dbus-cxx.git
- 添加 shell 环境变量,指定libsig++安装出来的pkgconfig的位置,以及指定
export PKG_CONFIG_PATH=/home/flork/git/libsigc++-3.0.0/__install/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/home/flork/git/libsigc++-3.0.0/__install/lib/pkgconfig:$PKG_CONFIG_PATH
3. 按照这些步骤安装即可
编译需要添加指令pkg-config --cflags --libs dbus-cxx-2.0
, 并添加shell 环境变量指定libsig++ 和 dbus-cxx的lib位置
export LD_LIBRARY_PATH=/home/flork/git/dbus-cxx/build:/home/flork/git/libsigc++-3.0.0/__install/lib:$LD_LIBRARY_PATH
例程
例程来自官方文档例程,详细介绍去文档dbus-cxx: Quick start example 0: A simple server and client
server.cpp
#include <dbus-cxx.h>
#include <unistd.h>double add(double param1, double param2) { return param1 + param2; }int main()
{std::shared_ptr<DBus::Dispatcher> dispatcher = DBus::StandaloneDispatcher::create();std::shared_ptr<DBus::Connection> conn = dispatcher->create_connection(DBus::BusType::SESSION);if (conn->request_name("dbuscxx.quickstart_0.server", DBUSCXX_NAME_FLAG_REPLACE_EXISTING) != DBus::RequestNameResponse::PrimaryOwner)return 1;// create an object on usstd::shared_ptr<DBus::Object> object = conn->create_object("/dbuscxx/quickstart_0", DBus::ThreadForCalling::DispatcherThread);// add a method that can be called over the dbusobject->create_method<double(double, double)>("dbuscxx.Quickstart", "add", sigc::ptr_fun(add));sleep(10);return 0;
}
client.cpp
#include <dbus-cxx.h>
#include <iostream>int main()
{std::shared_ptr<DBus::Dispatcher> dispatcher;dispatcher = DBus::StandaloneDispatcher::create();std::shared_ptr<DBus::Connection> connection;connection = dispatcher->create_connection(DBus::BusType::SESSION);// create an object proxy, which stands in for a real object.// a proxy exists over the dbusstd::shared_ptr<DBus::ObjectProxy> object;object = connection->create_object_proxy("dbuscxx.quickstart_0.server", "/dbuscxx/quickstart_0");// a method proxy acts like a real method, but will go over the dbus// to do its work.DBus::MethodProxy<double(double, double)> &add_proxy = *(object->create_method<double(double, double)>("dbuscxx.Quickstart", "add"));double answer;answer = add_proxy( 1.1, 2.2 );std::cout << "1.1 + 2.2 = " << answer << std::endl;return 0;
}
Makefile
.PHONY:cleanCXXFLAG = -std=c++17 -O3
PKGFLAG = `pkg-config --cflags --libs dbus-cxx-2.0`SERVER_SRC = server.cpp
CLIENT_SRC = client.cppSERVER_TARGET = server
CLIENT_TARGET = clientall:$(SERVER_TARGET) $(CLIENT_TARGET)$(SERVER_TARGET):$(SERVER_SRC)g++ $(CXXFLAG) $(SERVER_SRC) -o $(SERVER_TARGET) $(PKGFLAG) $(CLIENT_TARGET):$(CLIENT_SRC)g++ $(CXXFLAG) $(CLIENT_SRC) -o $(CLIENT_TARGET) $(PKGFLAG)clean:@if [ -e "$(CLIENT_TARGET)" ] ; then \echo "rm $(CLIENT_TARGET)" ; \rm $(CLIENT_TARGET) ; \fi;@if [ -e "$(SERVER_TARGET)" ] ; then \echo "rm $(SERVER_TARGET)" ; \rm $(SERVER_TARGET) ; \fi;
运行结果
先运行 server &
,再运行 client
接下来我打算对 server.cpp 从 dbus-cxx 源码进行分析,将开一篇新帖子。