1. 从Matlab导出.m文件为Dll文件;
Step1:将Matlab工作路径转为目标.m文件所在文件夹,在控制栏输入“mex –setup”,弹出如下说明:
Step2:点击“mex –setup C++”,弹出如下说明,看到“MEX configured to use ‘Microsoft Visual C++2013 Professional’ for C++ language compilation”,说明配置好用C++语言进行编译;
Step3:继续输入“deploytool”,弹出compile窗口,选择第三个,即Library Compiler;
Step4:在弹出窗口中,左上角选择“C++ Shared Library”,右侧添加需要转换的.m文件,下面第一行输入转换后的Dll文件名,最后点击右上角“Package”对号,如果.m文件中包含其他.m文件中的函数,不用一起添加,Matlab会自动检测,然后在窗口下面框中显示出依赖文件;
Step5:生成后文件夹如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和 .dll文件,第三个文件包含测试用地.h,.lib和 .dll文件等文件,是测试需要的;
Step6:新建一个Win32控制台应用程序工程,自己命名,比如然后将for_testing文件中的 .h,.lib和 .dll文件拷到新建应用程序下和.cpp文件放在一起,如下图
2. 配置电脑系统环境变量和VS工程属性;
Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”
Step2:在项目属性中的包含目录添加“Matlab安装目录\extern\include;”
Step3:在项目属性中的库目录添加“Matlab安装目录\extern\include\lib\win64\microsoft;”
Step4:在项目属性链接器输入中添加以下库名
libmat.lib
libmex.lib
mclmcr.lib
mclmcrrt.lib
libemlrt.lib
libeng.lib
libfixedpoint.lib
libcovrt.lib
Step5:为项目添加matlab生成的头文件(上面Step6中和cpp文件放一起的那个.h文件)。
3. 编写测试程序:
// cpp5.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include
#include
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "Mylib.h"
using namespacestd;
#pragma comment(lib,"Mylib.lib")
int _tmain(int argc,_TCHAR* argv[])
{
if(!MylibInitialize()) //初始化
{
printf("Could not initialize addfunction!");
exit(0);
}
printf("OK!");
mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray a(1, 1, mxDOUBLE_CLASS,mxREAL);
mwArray b(1, 1, mxDOUBLE_CLASS,mxREAL);
doubledata1 = 2; double data2 = 3;
a.SetData(&data1,1);
b.SetData(&data2,1);
result.SetData(&data2,1);
f(1,result, a, b); //调用自己用matlab写的函数
x= a.Get(1, 1);
y= b.Get(1, 1);
z= result.Get(1, 1);
printf("%lf\n", x);
printf("%lf\n", y);
printf("%lf\n", z);
MylibTerminate();
return0;
}
4.mwArray类常用方法的调用和问题;
a. 将数组数据输入到mwArray变量中:
result.SetData(array,len);
其中array是数组名,len是数组长度,如果是标量,如上面代码中所示;
b. 获取mwArray中数据:
y =b.Get(arg1, arg2,…);
arg1是索引数目,后面输入参量是索引;
5. 常见问题汇总:
1. 系统变量一定不能多设,例如Matlab runtime路径设置一个就可以;Matlab安装目录下的bin\Win64路径只需着一个就可以,像…\lib和…\bin等母路径不必多加,多加反而画蛇添足,导致程序运行出现一系列莫名其妙的问题。还有链接器中输入项添加的.lib文件只需添加用到的库,没有用到的不要加,常用的就是libmx.lib,libmat.lib,mclmcrrt.lib,mclmcr.lib。
2. 上面添加include路径和lib路径是在VC++目录下,而不是在C/C++目录下,否则会出现程序崩溃问题;
3. 如果提示缺失”mclmcr.lib”,是因为没有配置系统环境变量;
4. 如果mwDLLInitialize初始化错误,程序编译无错误但运行出错,检查时候是系统环境变量添加冗余;
5. Matlab同样可以导出.Net架构下得Dll文件,以供C#语言调用,该过程比转为C++能用的Dll要简单,工程配置少,问题少。