1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Matlab函数封装为DLL供Cpp调用

Matlab函数封装为DLL供Cpp调用

时间:2021-05-06 20:06:05

相关推荐

Matlab函数封装为DLL供Cpp调用

Matlab函数封装为DLL供Cpp调用

文章目录

Matlab函数封装为DLL供Cpp调用Ⅰ目标Ⅱ 学习Ⅲ 实现1. Matlab 函数封装为DLL2. vs中C++调用Matlab DLL步骤Ⅳ 问题解决Ⅴ 后续可能有用信息

Ⅰ目标

Matlab函数封装为DLL,供Cpp调用Matlab函数为类函数,matlab函数功能复杂

Ⅱ 学习

整体流程:

①**(整体学习)** 浅析将matlab函数编译成dll供Cpp调用的方法 /s/blog_9908653401012hz3.html

②**(主要参考)** VS调用Matlab编译生成的DLL 编译环境设置 [吐血整理] 来自 /weixin_41760829/article/details/79389685

Matlab类函数的实现

① Matlab类 函数

参考:[面向对象:MATLAB的自定义类 MATLAB]

② Matlab类函数,类method想对类的property值进行修改,需建立句柄类

Matlab 为传值函数

参考:句柄类和值类的比较 /help/matlab/matlab_oop/comparing-handle-and-value-classes.html

C++ 调用Matlab DLL函数,接口调用方法(参数传递、返回值的写法)

Matlab mwArray学习

mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值mwA.SetData(&a, 1);// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值c = mwC.Get(1, 1);MyAdd(1, mwC, mwA, mwB);Ref:涉及指针 mlxMyFunc(int nlhs, mxArray *plhs[], intnrhs, mxArray *prhs[])/xinm1001/article/details/53574836涉及输入值/weixin_41760829/article/details/79389685

Ⅲ 实现

1. Matlab 函数封装为DLL
编好要使用的.m文件在命令窗口中选中要使用的编译器,使用命令:mbuild -setup在命令窗口中输入命令:deploytool在弹窗中选择Library Compiler,然后会弹出如下窗口

参考:MATLAB中通过Library Compiler生成dll 来自 /bloke_come/article/details/77524776

2. vs中C++调用Matlab DLL步骤

添加include路径:C:\Program Files\MATLAB\Rb\extern\include

添加lib路径:C:\Program Files\MATLAB\Rb\extern\lib\win64\microsoft

添加附加lib:linker->input 追加 “项目-属性-配置属性-链接器-输入”

TestMat64.lib; libmx.lib; libmat.lib; mclmcr.lib;mclmcrrt.lib; 第1个是自己的M文件mcc生成的

将 .lib文件,放入当前/前一级文件夹

在头文件中添加生成的.h文件

关键代码:

#include "stdafx.h"#include "phyadaper_interface.h"#include "PhyAdapter.h" using namespace std;int main(){mclmcrInitialize();if (!mclInitializeApplication(NULL, 0)) return 0;if (!phyadaper_interfaceInitialize( )) return 0;cout << "***** start phyadaper_initialize ..." << endl;mwArray moutput1(1,1,mxINT32_CLASS);phyadaper_initialize(1,moutput1);int output1 = moutput1.Get(1, 1);cout << output1 << endl;...phyadaper_interfaceTerminate();mclTerminateApplication();return 0;}

参考:

VS调用Matlab编译生成的DLL 编译环境设置 [吐血整理] /weixin_41760829/article/details/79389685

Ⅳ 问题解决

⭐问题:matlab类函数,封装为DLL后,DLL中只剩下初始化函数,无法调用类的method。

解决:将类的method,分别用其他的函数封装,然后将多个接口函数,共同进行library compiler

问题:报错:

Deployed applications must use a prototype file instead of a header file. To create the prototype, use the loadlibrary mfilename option. Use the prototype file in compiled code. See /help/compiler/matlab-library-loading.html for more information.

解决:

loadlibrary('HXWatchAdapter', 'HXWatchAdapter.h', 'mfilename', 'mHXWatchAdapter'); loadlibrary('HXWatchAdapter',@mHXWatchAdapter);

参考:/help/compiler/matlab-library-loading.html

问题:报错:

fatal error LNK1181: 无法打开输入文件 错误

解决:

无法找到相关.lib有关,可以将lib放入上一级目录

参考:

/topics/350176906?list=13363673

问题:报错:

Error using loaddefinedlibrary

解决:

可能因为没找到Matlab函数引用的DLL。可以在进行matlab函数封装为DLL时,即在调用library compiler时," Files required for your library to run",添加上所用的DLL文件

参考:

/matlabcentral/answers/81645-error-using-matlab-loadlibrary-function

问题:报错:

帧不在模块中

参考:

VS调用Matlab编译生成的DLL 编译环境设置 [吐血整理] /weixin_41760829/article/details/79389685

Ⅴ 后续可能有用信息

(C#调用Matlab生成的DLL)

C#调用MATLAB生成的DLL以及多个m文件生成一个DLL /weixin_39559414/article/details/95059135

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。