Matlab 2013a 和 VS2010 混合编程

最近由于项目需求,某项目的算法是基于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(输出参数个数、输出参数、输入参数个数、输入参数)

时间: 2025-01-12 16:18:52

Matlab 2013a 和 VS2010 混合编程的相关文章

matlab 2012 vs2010混合编程

电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Program Files\opencv 补充说明: 在配置前,先检查一下系统变量: 1.若缺少系统变量(该路径必须添加!!!): D:\Program Files\MATLAB\R2012a\runtime\win64 导致结果:程序无法正常启动0x000007b.请单击“确定”关闭应用程序 注意变量配置后

matlab和C/C++混合编程--Mex

最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我们会重点关注混合编程中最难解决数据的问题--结构到底如何转换,并且后面会重点说一下自己的程序. 一.Mex的结构 先看一个简单的程序(该程序保存在matlab主目录下名字是mexDemon.cpp,或者在主目录下新建一个.cpp文件): #include "mex.h" //加入头文件,该

【5.1送礼】国内第一部Matlab和C#.Net混合编程入门级视频教程【完全免费】

上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视频教程是在2012年年底闲时比较多,当初也是很多朋友,网友提出这个Matlab.Net混合编程入门比较难,没有资料,所有就特意录制了一部比较简单的视频教程.并有条件的对广大网友免费开

matlab和C/C++混合编程--调用opencv

最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然后用c#调用matlab,单单这个配置问题就搞了我们一个多星期,不过还是顺利解决了,解决方法以后有时间再写个博客出来. 虽然我们整个项目已经能在c#下跑通了,但是检索效果真不理想,检查各种可能出现问题的地方,首先自然是特征的问题.我们做的是偏图像的检索,有些现成的特征提取算法是在opencv下实现的

MATLAB与C/C++混合编程的一些总结

[转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数.要返回多个参数,就得用指针或者struct/class(其他的高招?).但这些麻烦的地方在C程序的函数与函数之间是没有太大问题的,关键是不要在C与MATLAB的接口之处搞的太复杂. 但是,我们在写MATLAB代码的时候,由于变量的格式非常自由,所以我们往往都尽量把变量的格式设计成很comprehen

[Matlab] matlab与C/C++混合编程汇总

matlab 与外部程序的编程接口两大类: 一是 如何在matlab里调用其他语言写的代码. (见例子:使用C-MEX技术,ActiveX技术) 二是 如何在其他语言里调用matlab. (见 使用matlab引擎, MAT数据交换, matlab发布com组件, DeployTool) matlab接口技术包含以下几个方面: 1. 数据导入导出,主要是MAT文件数据的导入导出. 2.普通的动态链接库dll文件的交互,Matlab6.5起,直接matlab环境中调用dll文件导出的函数. 3.m

Matlab和C语言混合编程,包含目录的设定

如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改一下mex的编译选项,否则会报fetal error C1083,找不到包括文件. 这里需要注意的是,在mex之前,需要使用 mex -setup 选择编译器,假如我选的是VS2012,那么我需要把相应的选项加到VS2012所对应的opt文件中,具体的位置在 ‘MATLAB路径\R2013a\bin

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht