python实现c++中so库调用及dbus服务开发

本期介绍主要分两块,一块是python如何调用so库,另一块是dbus服务的注册与调用;

python调用so库

1. c++源码

# test.h文件

#include<iostream>
using namespace std;

extern "C"{
int cacl(int a, int b);
struct student{
        char sname[50];
        int score;
    };
student printInfo(student stu[], void callback(int));
}


# test.cpp文件

#include "test.h"  

extern "C"{
    int cacl(int a, int b){
        cout << "这是库文件内容" << endl;
        return a>b?a:b;
    }
    //创建学生结构体
    struct student;
    student printInfo(student stu[], void callback(int)){
        int total_score = 0;
        for(int i = 0; i < 3; i ++){
            cout << "第" << i+1 << "个学生名字是: " << stu[i].sname << endl;
            total_score += stu[i].score;
        }
        callback(total_score);
        return stu[0];
    }
}

# main.cpp文件

#include "test.h"

void func(int score){
    cout << "这是回调函数内容" << endl;
    cout << "获取分数总值" << score << endl;
}

int main(){
    int a = cacl(89, 5);
    cout << "这是main函数内容" << "  最大值是" << a << endl;
    student stu[3]={
        {"jack", 100},
        {"rose", 67},
        {"lili", 90}
    };
    student stt = printInfo(stu, func);
    cout << stt.sname << endl;
}

#  cd "/xxxx/" && g++ main.cpp test.cpp  -o main && "/xxx/"main 命令运行结果
这是库文件内容
这是main函数内容  最大值是89
第1个学生名字是: jack
第2个学生名字是: rose
第3个学生名字是: lili
这是回调函数内容
获取分数总值257
jack

main.cpp是为了测试test.cpp是否正常,可以不用管;

以上代码有几个需要注意的点:

  • extern "C", 这个在头文件和cpp文件中都得加上,不然在python中调用时总是报错找不到方法;
  • sname必须用char去定义,而不是string,否则python代码运行后会出现乱码;
  • printInfo方法的返回值,以上写法只能返回第一个元素,这一点懂C++的都明白,我不太会写C++,代码能调通就是我的极限了......

总之,以上代码实现了一个简单的比数值大小的方法cacl,一个稍微复杂的打印结构体参数

### C++ 中 D-Bus 总线的用法 在 C++ 开发中,D-Bus 是一种广泛使用的消息传递机制,允许不同应用程序之间进行通信。以下是关于如何使用 `libdbus-c++` 以及可能遇到的一些常见错误及其解决方案。 #### 安装依赖项 为了开发基于 D-Bus 的应用,首先需要确保已安装必要的。可以通过以下命令完成安装: ```bash sudo apt-get install libdbus-c++-dev ``` 此操作会下载并配置所需的头文件和静态/动态链接[^1]。 #### 基本概念 D-Bus 提供了一种灵活的方式让不同的应用程序通过总线交换数据。其核心组件包括: 1. **Libdbus**: 这是一个低级别的基础,负责处理原始协议细节。 2. **消息总线守护进程 (Message Bus Daemon)**: 负责连接多个客户端并将消息路由至目标地址。 3. **高级封装 (Bindings)**: 如 `libdbus-glib`, `libdbus-qt` 和 Python 绑定等工具可以显著减少复杂度,并提供更易读取的接口[^2]。 对于 C++, 推荐直接利用官方支持的 `libdbus-c++` 来构建项目。 #### 编写简单的发送者与接收者的例子 下面展示了一个基本的例子来说明怎样创建一个服务端(监听请求)和服务调用方(发出方法调用): ##### 创建服务端 定义好要暴露给外部访问的方法之后启动服务器等待事件到来: ```cpp #include <dbus/dbus.h> #include <iostream> // 处理接收到的消息回调函数原型声明 static void handle_method_call(DBusConnection *conn, DBusMessage *msg); int main() { DBusError err; dbus_error_init(&err); // 设置名称 const char* bus_name = "com.example.MyService"; DBusConnection *connection; connection = dbus_bus_get(DBUS_BUS_SESSION, &err); if (!connection || dbus_error_is_set(&err)) { /* error handling */ } if(!dbus_request_name(connection,bus_name,DBUS_NAME_FLAG_DO_NOT_QUEUE,&err)){ std::cerr << "Failed to acquire name on the session bus."<<std::endl; return -1; } while(true){ if(dbus_connection_read_write_dispatch(connection,-1)==FALSE){/*error*/} } return 0; } void handle_method_call(DBusConnection*, DBusMessage*){} ``` 上述代码片段展示了设置一个简单的服务过程,其中包含了获取总线连接、注册名字空间等内容. ##### 发送远程方法调用 当另一个程序希望执行某些动作时,则需向该路径下的对象发起RPC风格的操作: ```cpp #include <dbus/dbus.h> #include <iostream> bool call_remote_method(const char* destination, const char* object_path, const char* interface, const char* method) { DBusError err; dbus_error_init(&err); DBusConnection* conn = dbus_bus_get(DBUS_BUS_SESSION, &err); if (!conn || dbus_error_is_set(&err)) {/* Handle Error*/}; DBusMessage* msg = dbus_message_new_method_call(destination,object_path,interface,method); bool success=false; if(msg!=nullptr && dbus_connection_send(conn,msg,NULL)){ success=true; }else{/*Handle Failure*/} if(msg) dbus_message_unref(msg); if(conn) dbus_connection_close(conn); return success; } ``` 这段脚本实现了构造一条针对指定目的地的目标位置上的具体功能呼叫链路的功能. #### 解决常见的编译运行期问题 如果按照以上指导仍然无法正常工作,请考虑以下几个方面: - 确认所有必需软件包已被正确加载. - 验证环境变量 PATH 是否指向正确的共享目录. - 如果涉及多线程同步逻辑的话还需要额外引入 pthread 支持. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值