IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> windows下py调用vs2019生成dll库 -> 正文阅读

[开发工具]windows下py调用vs2019生成dll库

之前使用py调用了matlab的 .m 文件(上一篇博客),能够实现使用matlab进行计算的效果,但实际使用下来,计算的速度还是稍微慢了一些。同样的一个函数执行100次,使用py调用matlab的方法,大概需要6s左右;使用py调用dll库的方法,只需要0.2s。。

生成dll库,我使用的方法是,先将matlab代码转成c代码,再利用vs将c代码生成dll库。

软件环境:win10(64位),py3.6,vs2019, matlab2020b

一.matlab部分
1.首先先写好需要转化的matlab代码,写成函数形式。
注意,函数名要和文件名一致,并且函数要在开头定义。

function [out_x, out_y, out_z] = matlabToC(in_Bx, in_By, in_Bz)

	% 需要实现功能的代码...

    out_x = x_gbn(1);
    out_y = x_gbn(2);
    out_z = x_gbn(3);
end

我定义的是一个3输入3输出的函数。

2.使用matlab自带的工具箱进行代码生成。
在这里插入图片描述
选择编写好的 .m文件
在这里插入图片描述
确定函数的参数数据类型,输入一个调用函数的示例即可。
matlab自动识别后,还可以进行手动调整。我使用的函数三个参数都是double类型的。
在这里插入图片描述
这里可以让matlab验证一下你的函数输入输出,生成一些数据测试,可以跳过。
在这里插入图片描述
选择c或c++,我选择的是c++,然后生成即可。
在这里插入图片描述
在 .m文件所在的文件夹,会生成一个 codegen 文件夹,生成的代码就在里面
在这里插入图片描述
在matlab生成的文件中,有一个文件夹是 examples ,里面有两个文件,分别是 main.h 和 main.cpp ,里面是自动生成的调用模板,可以参考。
至此,matlab部分完成。

二.vs2019部分。
使用vs2019利用matlab生成的c代码,生成dll库。
此部分可以参考博客:
https://blog.csdn.net/maosijunzi/article/details/79354806

首先新建一个项目
在这里插入图片描述
生成的界面为
在这里插入图片描述
接下来需要将matlab生成的所有 .cpp 和 .h 文件加入到工程中。
将第一部分生成的所有的 .cpp 和 .h 文件复制到vs创建的工程下,添加项即可。
得到的结果为
在这里插入图片描述
接下来修改 pch.h 和 pch.cpp 。这两个文件是新建工程时自动生成。
主要是添加外部调用的接口。

在参考的main函数中,自动生成的调用参考为:

 static void main_matlabToC()
{
  double in_Bx_tmp;
  double out_x;
  double out_y;
  double out_z;

  // Initialize function 'matlabToC' input arguments.
  in_Bx_tmp = argInit_real_T();

  // Call the entry-point 'matlabToC'.
  matlabToC(in_Bx_tmp, in_Bx_tmp, in_Bx_tmp, &out_x, &out_y, &out_z);
}

所以,我需要调用的函数是matlabToC,并且输入的参数分别是三个double类型,和三个double类型的引用。

因此在 pch.cpp 中,调用的接口可以写成

#include "matlabToC.h"

void matlab_Gauss(double in_Bx_tmp, double in_By_tmp, double in_Bz_tmp, double &out_x, double &out_y, double &out_z)
{
	matlabToC(in_Bx_tmp, in_By_tmp, in_Bz_tmp, &out_x, &out_y, &out_z);
}

而在 pch.h 中,需要声明为外部调用,在函数声明前加上
extern “C” _declspec(dllexport)

extern "C" _declspec(dllexport) void matlab_Gauss(double in_Bx_tmp, double in_By_tmp, double in_Bz_tmp, double& out_x, double& out_y, double& out_z);

这两个文件的内容如图
在这里插入图片描述
此时点击重新生成dll,即可生成dll库。
在这里插入图片描述
但有可能会出现报错。
在这里插入图片描述
缺少 tmwtypes.h 文件。这个文件是matlab自带的库文件,所以在生成过程时没有添加到c文件中。
可以将该文件的路径添加到编译器中,或者把文件复制过来。
此文件的路径为 XX\R2020b\extern\include
XX表示的是你的matlab的安装路径。

再次重新生成dll库时,可能还会提示另一个错误
在这里插入图片描述
大概是需要向每一个源文件中添加一句 #include “pch.h” 。。

之后再生成dll库,就能够正常生成通过了。

三.py调用dll库
用py加载dll库,使用自定义的函数。加载dll库,我使用的是py的 ctypes 库。因为py和c的数据类型不相同,所以需要借用 ctypes 库对两者的数据类型进行转化。
参考资料:
https://docs.python.org/zh-cn/3/library/ctypes.html#type-conversions

在这里插入图片描述
在参考资料中,也有关于引用传递形参的介绍
在这里插入图片描述
需要注意的是,py是不需要定义数据类型就能够直接使用一个变量,而c中需要定义一个变量类型,分配内存,才能够使用变量。所以在py中,需要先利用 ctype 库定义变量,才能够在c函数中使用。而对于引用,则可以使用 byref 函数。

py的参考代码:

import ctypes
# 加载dll库
pDll = ctypes.cdll.LoadLibrary
matlabGuass = pDll("E:\\myDesktop\\protect\\vs2019\\testDll2\\x64\\Release\\testDll2.dll")

# 定义变量
in_Bx = ctypes.c_double(0.02)
in_By = ctypes.c_double(0.05)
in_Bz = ctypes.c_double(0.01)
out_x = ctypes.c_double()
out_y = ctypes.c_double()
out_z = ctypes.c_double()

# 使用dll库中的函数
matlabGuass.matlab_Gauss(in_Bx, in_By, in_Bz, ctypes.byref(out_x), ctypes.byref(out_y), ctypes.byref(out_z))

# 使用得到的结果
print(out_x.value, out_y.value, out_z.value)

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:33:52  更:2021-09-14 13:34:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:16:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码