最近为了生成以及调用.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])

【DLL】clion生成.dll文件、python调用.dll文件相关推荐

  1. python和C++联合开发(python调用DLL文件)

    在开发的过程中的有的厂家提供的API,或者其他同事写的功能模块用的是C++语言,而因为我们自己菜或者懒习惯使用python脚本语言开发,这里主要讲解如何使用python调用DLL文件(windows平 ...

  2. Python 调用 DLL

    Python 调用 DLL 一.C++ 编写 DLL 1..hpp 头文件 // dll_test.hpp#ifdef DLL_TEST #define MY_API _declspec(ddllex ...

  3. python编程(python调用dll程序)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 很多人说python的效率比较低,主要是没有分清什么时候用python.什么时候用c.对于网络. ...

  4. python调用dll函数指针_python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  5. python如何调用dll库中的函数_Python调用dll库接口-ctypes方法

    背景 最近需要用python写个脚本程序(win10 环境),需要调用现成的dll库完成这项任务,对于一直在Linux平台上开发程序的本人来说,从没有过使用dll的经历(不得不说还是so大法好),遇到 ...

  6. 用python读取身份证信息的功能分析与实现,兼述python调用dll的方法

    背景 有这样一个需求,要求能自动读取用户的身份证信息.如果是一代身份证,这个功能恐怕只能通过图像识别的办法来解决了.不过现在二代身份证已经很普及.客户要求能读二代身份证就可以了. 现在二代身份证阅读器 ...

  7. DLL动态链接库生成及其動態调用(二)

    DLL动态链接库生成及其動態调用(二) 一.說明 對上一篇DLL的補充,上一篇是靜態鏈接,補充動態鏈接方式.相比靜態鏈接,會節省內存,但是可能使用過程有點複雜. 有朋友交了一種定義函數指針的方法,奈何 ...

  8. python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call

    python调用dll报错:ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong call ...

  9. python调用dll函数_从Python调用DLL函数

    我想从Python调用DLL中的函数.但我有个错误:"Attribute Error function not found" 这是我的代码:import os import cty ...

最新文章

  1. linux debian ntp,Debian下面的ntp服务(ntpdate)的安装
  2. 北大教授杨超、清华教授唐杰获首届“王选杰出青年学者奖”
  3. 如果世界上只有一种数据结构,那么我选择 hash
  4. FIR基本型仿真_03
  5. Android之OKHttp使用总结
  6. 【DP】划分数列(ybtoj DP-2-1)
  7. html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?
  8. 单向链表的简单Java实现-sunziren
  9. K8S_Google工作笔记0002---K8S集群架构组件
  10. 【实习之T100开发】T100 单档程序开发(1)开发流程
  11. 单位阶跃信号是周期信号吗_直流散热风扇的信号你知道如何控制吗?
  12. java调用Dos命令
  13. Android - 文字中显示图片
  14. 机器学习专项练习笔记(持续更新)
  15. kubernetes快速切换集群和名称空间
  16. 报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
  17. html+js 调用摄像头识别二维码
  18. 虚拟直播需要哪些设备?如何搭建虚拟直播团队?
  19. Qt原对象metaObject编译错误的问题
  20. 洛谷P1386座位安排

热门文章

  1. HTML主题标记是,HTML网页超链接标记
  2. LabVIEW谨慎使用局部变量和全局变量
  3. ESP32-C3入门教程 问题篇⑬——IOS手机蓝牙连接容易断开问题,BT_HCI: DiscCmpl evt: hdl=1, rsn=0x8
  4. 美容院预约系统软件开发
  5. mp4转gif 转换_如何将MP4视频转换为GIF
  6. 20159302《网络攻击与防范》第九周学习总结
  7. 光环国际:从程序员到PM:外行可以领导内行吗?
  8. 光环国际PMP:看完你就知道什么是瞎忙与高效
  9. CGB2202-DAY06-多线程,锁
  10. android使用airpods软件,安卓怎么使用airpods?安卓上兼容AirPodsPro软件方法教程[多图]...