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