【DLL】clion生成.dll文件、python调用.dll文件

最近为了生成以及调用.dll文件,踩了一些雷,记录如下

目录

1、clion中生成.dll

2、clion中测试生成的.dll文件

3、在python中调用.dll文件

【1】导入.dll

【2】ctypes数据类型转换

1、clion中生成.dll

参考下述链接

使用 Clion 生成并测试动态链接库 DLL_MichaelToLearn的博客-CSDN博客_clion dll

在使用时需注意:

在创建好C Library后,将自己原始的.c、.h文件拷入(除main.c、main.h之外)

另:创建后生成的library.c、library.h文件可直接删除

然后点击

 即可生成.dll文件

2、clion中测试生成的.dll文件

为了在clion中测试刚生成的.dll文件,共分以下三步:

 【1】创建一个新的lib文件夹,将刚生成的.dll文件复制到里面

【2】修改CMakeLists.txt,具体操作步骤参考文章开头的链接

【3】写main.c

main.c需要将自己的main.c修改一下,例如,原函数主函数如下

#include "var_struct.h"
#include "ppg_hr.h"

// 数据声明
static void main_ppg_hr(void) {
//    // 【1】静止数据
    data_percision accx_tmp[500] = {此处省略500个数};
    data_percision accy_tmp[500] = {};
    data_percision accz_tmp[500] = {};
    data_percision ppg_tmp[250] = {};
    
    // 设置输出
    data_percision output_data[2];
    // 输入两个参考历史值
    data_percision hr_old_tmp[5] = {0, 0, 0, 0, 0};
    data_percision SQI[5] = {0, 0, 0, 0, 0};

    int output_size;

    // 调用函数
    ppg_hr(ppg_tmp, accx_tmp, accy_tmp, accz_tmp, hr_old_tmp, SQI, output_data, *(int (*)[1]) &output_size);

}

int main(int argc, char **argv)
{
    (void)argc;
    (void)argv;

    main_ppg_hr();
    return 0;
}

 需要修改如下:要提前定义需要调用的函数

#include <stdio.h>

// 定义数据精度
typedef double data_percision;
void ppg_hr(data_percision ppg0[250], data_percision accx[500], data_percision accy[500], data_percision accz[500],
            data_percision hr_old[5], data_percision SQI[5], data_percision output_data[6], int output_size[1]);
// 数据声明
static void main_ppg_hr(void) {
//    // 【1】静止数据
    data_percision accx_tmp[500] = {};
    data_percision accy_tmp[500] = {};
    data_percision accz_tmp[500] = {};
    data_percision ppg_tmp[250] = {};
    
    // 设置输出
    data_percision output_data[6];
    // 输入两个参考历史值
    data_percision hr_old_tmp[5] = {0, 0, 0, 0, 0};
    data_percision SQI[5] = {0, 0, 0, 0, 0};

    int output_size;

    // 调用函数
    ppg_hr(ppg_tmp, accx_tmp, accy_tmp, accz_tmp, hr_old_tmp, SQI, output_data, *(int (*)[1]) &output_size);

}

int main() {
    printf("Hello, World!\n");
    main_ppg_hr();
    return 0;
}

3、在python中调用.dll文件

【1】导入.dll

在这部分出现的很多错误我用的是python3.9版本,已知python3.8就修改了.dll的查找路径什么的...我出现的问题是:在同一路径下的.dll文件,有的可以成功导入,有的就是找不到

 找遍了网上的各种解决方法,最后我把interpreter换了...从3.9换成了3.6

 (但是现在吧interpreter还回去也不会出现问题了,我也不懂是什么原理)

【2】ctypes数据类型转换

在python调用.dll时需要对数据进行转换,看网上有很多使用 ctypes.c_double 类似的传参,但是我要传一个数组,没有找到怎么让用这个方法赋值

所以我的解决方法如下:

# 首先定义数组
accx = (c_double*500)()
accy = (c_double*500)()
accz = (c_double*500)()

# 循环对数据类型进行转换
for i in range(0, 500):
    accx[i] = accx_tmp[i]
    accy[i] = accy_tmp[i]
    accz[i] = accz_tmp[i]

由于输出的数据也是数组,所以打印的时候需要循环打印,不然打印会出错

# 打印输出 hr
print("【1】")
print("hr ——", output1_data[0])
print("sports_state ——", output1_data[1])

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值