最近为了生成以及调用.dll文件,踩了一些雷,记录如下
目录
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])