Matlab 2013a 和 VS2010 混合编程
最近由于项目需求,某项目的算法是基于MATLAB完成的,在短时间内需要去调用算法功能。因此,基于MATLAB生成DLL, C 调用的方式完成。
环境:MATLAB 2013a + VS2010 + win8.1 + 64位系统
一、MATLAB 编译环境设置
1. 安装,MATLAB安装时选择 force 32bit, 这样生成的dll在32位和64位的机器上都可以调用。
2. 装好MATLAB 2013后,打开软件,进行配置
>> mex -setup
Welcome to mex -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2013a/win32.html
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?y
Select a compiler:
[] Lcc-win32 C 2.4. in D:\PROGRA~\MATLAB\R2013a\sys\lcc
[] Microsoft Visual C++ in D:\Program Files (x86)\Microsoft Visual Studio 10.0 [] None Compiler: Please verify your choices: Compiler: Microsoft Visual C++
Location: D:\Program Files (x86)\Microsoft Visual Studio 10.0 Are these correct [y]/n? y ***************************************************************************
Warning: MEX-files generated using Microsoft Visual C++ require
that Microsoft Visual Studio run-time libraries be
available on the computer they are run on.
If you plan to redistribute your MEX-files to other MATLAB
users, be sure that they have the run-time libraries.
*************************************************************************** Trying to update options file: C:\Users\robin\AppData\Roaming\MathWorks\MATLAB\R2013a\mexopts.bat
From template: D:\PROGRA~\MATLAB\R2013a\bin\win32\mexopts\msvc100opts.bat Done . . .
显示 Done 后执行下一步
>> mbuild -setup Welcome to mbuild -setup. This utility will help you set up
a default compiler. For a list of supported compilers, see
http://www.mathworks.com/support/compilers/R2013a/win32.html Please choose your compiler for building shared libraries or COM components: Would you like mbuild to locate installed compilers [y]/n? y Select a compiler:
[] Microsoft Visual C++ in D:\Program Files (x86)\Microsoft Visual Studio 10.0 [] None Compiler: Please verify your choices: Compiler: Microsoft Visual C++
Location: D:\Program Files (x86)\Microsoft Visual Studio 10.0 Are these correct [y]/n? y ****************************************************************************
Warning: Applications/components generated using Microsoft Visual C++
require that the Microsoft Visual Studio run-time
libraries be available on the computer used for deployment.
To redistribute your applications/components, be sure that the
deployment machine has these run-time libraries.
**************************************************************************** Trying to update options file: C:\Users\robin\AppData\Roaming\MathWorks\MATLAB\R2013a\compopts.bat
From template: D:\PROGRA~\MATLAB\R2013a\bin\win32\mbuildopts\msvc100compp.bat Done . . .
这样,MATLAB的Mex编译环境就配置好了。
二、MATLAB 代码编译dll
打开MATLAB源代码,找到最顶层的m文件,注意顶层必须为function方式。
例如,MATLAB的顶层函数为
文件 ship_track1.m
function finish_flag = ship_track1(input_x,input_y,num_ori)
为某目标检测算法,input_x ,input_y,和num_ori为输入的3个参数
那么编译的指令为
>> mcc -W cpplib:libship_track1 -T link:lib ship_track1.m -C
配置完成后会在MATLAB工程目录生成7个文件
libship_track1.cpp
libship_track1.ctf
libship_track1.dll
libship_track1.exp
libship_track1.exports
libship_track1.h
libship_track1.lib
当然我们需要用到的只有4个
libship_track1.ctf
libship_track1.dll
libship_track1.h
libship_track1.lib
三、VS2010 MFC 工程配置
1. 新建VS2010 MFC 工程
2. 将第二步MATLAB编译生成的4个文件拷贝入MFC工程目录下
将头文件 libship_track1.h 添加进工程
3. 项目属性设置
1)选择项目->项目属性->所有配置

C/C++ -> 常规->附加包含目录,找到MATLAB下的include目录
D:\Program Files (x86)\MATLAB\R2013a\extern\include
(根据MATLAB的安装路径确定)
2)链接器->常规->附加库目录
D:\Program Files (x86)\MATLAB\R2013a\extern\lib\win32\microsoft

3) 链接器->输入->附加依赖项
libship_track1.lib
libship_track2.lib
mclmcrrt.lib
libmx.lib
libmat.lib
mclmcr.lib

到此就配置完成。
四、MFC 调用DLL
1. 初始化
if(!libship_track1Initialize()) //初始化1通道
{
//MessageBox(_T("could not initialize the application"));
}
2. 传递参数
double _Data1_1[] = {}; //输入数组
double _Data1_2[] = {};
for(int i=; i< chn1_num; i++)
{
_Data1_1[i] = Chan1_x[i];
_Data1_2[i] = Chan1_y[i];
}
mxArray* Data1_1 = mxCreateDoubleMatrix(, ,mxREAL); //创建1*5矩阵
memcpy(mxGetPr(Data1_1), (void*)_Data1_1,sizeof(_Data1_1)); //拷贝输入数据
mxArray* Data1_2 = mxCreateDoubleMatrix(, ,mxREAL); //创建1*5矩阵
memcpy(mxGetPr(Data1_2), (void*)_Data1_2,sizeof(_Data1_2)); //拷贝输入数据
double _Data1_3[];
_Data1_3[] = chn1_num;
mxArray* Data1_3 = mxCreateDoubleMatrix(, ,mxREAL); //创建1*1矩阵;
memcpy(mxGetPr(Data1_3), (void*)_Data1_3,sizeof(_Data1_3)); //拷贝输入数据
mxArray *input1[] = {Data1_1,Data1_2,Data1_3}; //将矩阵x的指针作为输入参数传递进去
//mxArray *output[1]; //定义输出参数指针
mlxShip_track1(,NULL, , input1);
mxArray是Matlab C 函数库的结构体,需要利用它来进行参数传递。
对于mlxShip_track1函数来说,其四个参数分别对应:
mlxShip_track1(输出参数个数、输出参数、输入参数个数、输入参数)
Matlab 2013a 和 VS2010 混合编程的更多相关文章
- matlab 2012 vs2010混合编程
电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...
- matlab和C/C++混合编程--Mex
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (六)参数传递
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (转载)
matlab和C/C++混合编程--Mex 最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续 ...
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- MATLAB与C/C++混合编程的一些总结
[转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数. ...
- matlab + c/c++ opencv 混合编程
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- Matlab和C语言混合编程,包含目录的设定
如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...
随机推荐
- 说“DPI”
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2007.03.08更新:2007.04.02 目录一.基本概念二.图像文件中的DPI三.PDG文件中的DPI四.PDF文件中 ...
- ajax上传json串格式的数据的处理 以及 js操作dom的另一种方式
- JavaScript(3)——Object-Oriented Design
自己定义函数 var Winston = function(nickname, age, x, y) { this.nickname = nickname; this.age = age + &quo ...
- CI框架源码学习笔记3——Log.php
上一节说完了Common.php,然而跟代码打交道总是免不了日志记录,所以这一节我们说说Log.php文件. 先看看类里面的几个属性, protected $_log_path; 日志路径 prot ...
- DP【洛谷P2134】 百日旅行
[洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...
- zookeeper客户端使用原生JavaApi操作节点
1.引入依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zook ...
- Drop user 报ORA-00600 [KTSSDRP1]
一客户删除一个数据库用户THH时报错: 说明在获取seg$时没有找到相应的条目,先来解释下这个600错误的参数含义: Arg [a] Tablespace number Arg [b] File nu ...
- spring自定义 xsd 位置
与元素类型 "beans" 相关联的属性 "xsi:schemaLocation" 的前缀 "xsi" 未绑定. 解决办法:(绿色字体) & ...
- Kibana6.x.x——启动后警告信息:Session cookies will be transmitted over insecure connections. This is not recommended.
启动Kibana后,如果你看到如下警告信息: server log [08:03:18.001] [warning][security] Session cookies will be transmi ...
- day_04 列表
1. 列表list 能装对象的对象,有序的(按照我们存放的顺序) 以[]表示,里面可以存放大量各种元素,各个元组用逗号隔开 列表也具有索引和切片 2. 列表的增改删查 1. 增 1.append() ...