Matlab 2016a和VS2013混合Dll编程步骤
2016-07-31 11:42
495 查看
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. 编写测试程序:
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要简单,工程配置少,问题少。
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 <stdio.h> #include <iostream> #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要简单,工程配置少,问题少。
相关文章推荐
- vs2013中使用matlab2014b引擎实现c++和matlab混合编程
- VC与Matlab混合编程之调用动态链接库dll(C++)——<二>
- matlab和c++混合编程---方法和步骤
- 混合编程---c++调用matlab生成的dll----findCircles的应用
- MATLAB.NET混合编程之一~~由MATLAB编译dll
- c与matlab混合编程之dll调用
- matlab和c++混合编程---方法和步骤
- OpenCV Mat 只能用静态数组定义时初始化,动态数组赋值给Mat需要逐元素进行. MATLAB,OpenCV,VS混合编程
- VS2013调用matlab生成的dll
- VS2015 MATLAB混合编程之COM组件
- Matlab生成C++代码及混合编程步骤说明
- matlab和c++混合编程---matlab和vs的环境配置问题
- vs2013 Matlab引擎 丢失libeng.dll
- VC与Matlab混合编程之调用动态链接库dll<二>
- 【MATLAB与C的混合编程】之【C程序调用M文件编译后得到的DLL文件】
- VB(EXE)/VC(DLL)混合编程实例
- 深入浅出Dll(介绍函数导出、类导出、钓子dll、不同语言混合编程方法、插件等的实现方法)
- [导入]JNI编程(Java访问C/C++ DLL)的大致步骤
- matlab和vc混合编程之matcom方式
- 深入浅出Dll(介绍函数导出、类导出、钓子dll、不同语言混合编程方法、插件等的实现方法)