码迷,mamicode.com
首页 > 其他好文 > 详细

Matlab 2013a 和 VS2010 混合编程

时间:2015-07-23 17:09:58      阅读:479      评论:0      收藏:0      [点我收藏+]

标签:

最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能。因此,基于MATLAB生成DLL, C 调用的方式完成。

环境:MATLAB 2013a + VS2010 + win8.1 + 64位系统

一、MATLAB 编译环境设置

1. 安装,MATLAB安装时选择 force 32bit, 这样生成的dll在32位和64位的机器上都可以调用。

2. 装好MATLAB 2013后,打开软件,进行配置

 

 1 >> mex -setup
 2 Welcome to mex -setup. This utility will help you set up 
 3 a default compiler. For a list of supported compilers, see 
 4 http://www.mathworks.com/support/compilers/R2013a/win32.html 
 5 Please choose your compiler for building MEX-files: 
 6 Would you like mex to locate installed compilers [y]/n?y
 7 Select a compiler: 
 8 [1] Lcc-win32 C 2.4.1 in D:\PROGRA~2\MATLAB\R2013a\sys\lcc 
 9 [2] Microsoft Visual C++ 2010 in D:\Program Files (x86)\Microsoft Visual Studio 10.0 
10 
11 [0] None 
12 
13 Compiler: 2
14 
15 Please verify your choices: 
16 
17 Compiler: Microsoft Visual C++ 2010 
18 Location: D:\Program Files (x86)\Microsoft Visual Studio 10.0 
19 
20 Are these correct [y]/n? y
21 
22 *************************************************************************** 
23 Warning: MEX-files generated using Microsoft Visual C++ 2010 require 
24 that Microsoft Visual Studio 2010 run-time libraries be 
25 available on the computer they are run on. 
26 If you plan to redistribute your MEX-files to other MATLAB 
27 users, be sure that they have the run-time libraries. 
28 *************************************************************************** 
29 
30 
31 Trying to update options file: C:\Users\robin\AppData\Roaming\MathWorks\MATLAB\R2013a\mexopts.bat 
32 From template: D:\PROGRA~2\MATLAB\R2013a\bin\win32\mexopts\msvc100opts.bat 
33 
34 Done . . . 

 

显示 Done 后执行下一步

 

 1 >> mbuild -setup
 2  
 3 Welcome to mbuild -setup.  This utility will help you set up  
 4 a default compiler.  For a list of supported compilers, see  
 5 http://www.mathworks.com/support/compilers/R2013a/win32.html 
 6  
 7 Please choose your compiler for building shared libraries or COM components: 
 8  
 9 Would you like mbuild to locate installed compilers [y]/n? y
10  
11 Select a compiler: 
12 [1] Microsoft Visual C++ 2010 in D:\Program Files (x86)\Microsoft Visual Studio 10.0 
13  
14 [0] None 
15  
16 Compiler: 1
17  
18 Please verify your choices: 
19  
20 Compiler: Microsoft Visual C++ 2010  
21 Location: D:\Program Files (x86)\Microsoft Visual Studio 10.0 
22  
23 Are these correct [y]/n? y
24  
25 **************************************************************************** 
26   Warning: Applications/components generated using Microsoft Visual C++      
27            2010 require that the Microsoft Visual Studio 2010 run-time       
28            libraries be available on the computer used for deployment.       
29            To redistribute your applications/components, be sure that the    
30            deployment machine has these run-time libraries.                  
31 **************************************************************************** 
32  
33  
34 Trying to update options file: C:\Users\robin\AppData\Roaming\MathWorks\MATLAB\R2013a\compopts.bat 
35 From template:              D:\PROGRA~2\MATLAB\R2013a\bin\win32\mbuildopts\msvc100compp.bat 
36  
37 Done . . . 

这样,MATLAB的Mex编译环境就配置好了。

二、MATLAB 代码编译dll

打开MATLAB源代码,找到最顶层的m文件,注意顶层必须为function方式。

例如,MATLAB的顶层函数为 

文件 ship_track1.m

1 function finish_flag = ship_track1(input_x,input_y,num_ori)

为某目标检测算法,input_x ,input_y,和num_ori为输入的3个参数

那么编译的指令为

1 >> mcc -W cpplib:libship_track1 -T link:lib ship_track1.m -C

配置完成后会在MATLAB工程目录生成7个文件

1 libship_track1.cpp
2 libship_track1.ctf
3 libship_track1.dll
4 libship_track1.exp
5 libship_track1.exports
6 libship_track1.h
7 libship_track1.lib

当然我们需要用到的只有4个

1 libship_track1.ctf
2 libship_track1.dll
3 libship_track1.h
4 libship_track1.lib

三、VS2010 MFC 工程配置

1. 新建VS2010 MFC 工程

2. 将第二步MATLAB编译生成的4个文件拷贝入MFC工程目录下

将头文件 libship_track1.h 添加进工程

 

3. 项目属性设置

1)选择项目->项目属性->所有配置

技术分享

C/C++ -> 常规->附加包含目录,找到MATLAB下的include目录

1 D:\Program Files (x86)\MATLAB\R2013a\extern\include

(根据MATLAB的安装路径确定)

2)链接器->常规->附加库目录

1 D:\Program Files (x86)\MATLAB\R2013a\extern\lib\win32\microsoft

技术分享

3) 链接器->输入->附加依赖项

1 libship_track1.lib
2 libship_track2.lib
3 mclmcrrt.lib
4 libmx.lib
5 libmat.lib
6 mclmcr.lib

技术分享

到此就配置完成。

四、MFC 调用DLL

1. 初始化

1 if(!libship_track1Initialize())    //初始化1通道
2 {
3       //MessageBox(_T("could not initialize the application"));
4 }

2. 传递参数

 1 double _Data1_1[5] = {0};                //输入数组
 2 double _Data1_2[5] = {0};
 3 for(int i=0; i< chn1_num; i++)
 4 {
 5     _Data1_1[i] = Chan1_x[i];
 6     _Data1_2[i] = Chan1_y[i];
 7 }
 8 
 9 mxArray* Data1_1 = mxCreateDoubleMatrix(1, 5,mxREAL);     //创建1*5矩阵
10 memcpy(mxGetPr(Data1_1), (void*)_Data1_1,sizeof(_Data1_1));           //拷贝输入数据
11 mxArray* Data1_2 = mxCreateDoubleMatrix(1, 5,mxREAL);     //创建1*5矩阵
12 memcpy(mxGetPr(Data1_2), (void*)_Data1_2,sizeof(_Data1_2));           //拷贝输入数据
13 double _Data1_3[1];
14 _Data1_3[0] = chn1_num;
15 mxArray* Data1_3 = mxCreateDoubleMatrix(1, 1,mxREAL);     //创建1*1矩阵;
16 memcpy(mxGetPr(Data1_3), (void*)_Data1_3,sizeof(_Data1_3));           //拷贝输入数据
17 mxArray *input1[3] = {Data1_1,Data1_2,Data1_3};                               //将矩阵x的指针作为输入参数传递进去
18 //mxArray *output[1];                        //定义输出参数指针
19 mlxShip_track1(0,NULL, 3, input1);

mxArray是Matlab C 函数库的结构体,需要利用它来进行参数传递。

对于mlxShip_track1函数来说,其四个参数分别对应:

mlxShip_track1(输出参数个数、输出参数、输入参数个数、输入参数)

 

Matlab 2013a 和 VS2010 混合编程

标签:

原文地址:http://www.cnblogs.com/zhubinwang/p/4670815.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!