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等等,那么就需要更改 ...
随机推荐
- C#提取TXT文档指定内容
早上有分享一篇<VB.NET提取TXT文档指定内容> http://www.cnblogs.com/insus/p/3267347.html 那是原网友的需求用VB.NET写的.刚才有只懂 ...
- 正经学C#_运算符优先级:[c#入门经典]
学了那么多的运算符,终于差不多结束了,现在要说一下 总体的优先级别 高到低的顺序 类别 运算符 结合性 前缀 ++,--,(),+,-,!,~ 从左到右 乘除 * / % 从左到右 加 ...
- ubuntu安装软件-笔记
手动安装过程 下载 - 配置文件 常用命令: sudo dpkg -i ******.deb 问题&解决思路 问题1:依赖项 - 缺少某一个依赖包 解决尝试: 1 . sudo apt-ge ...
- Jquery学习理解 (课堂)
Jquary概述 3 1.Jquary简介 3 1.1什么是jquery 3 2.使用jquary 4 2.1浏览器如何解析HTML文件 4 2.2利用选择器定位节点 4 2.3调用方法操作节点 5 ...
- 【转】HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
源地址:http://blog.csdn.net/chelen_jak/article/details/50040537
- 使用cookie实现自动登录
一.从登录——>主页面,进行的过程是,输入 用户名和密码,以及验证码,点击“登录”跳转到Activity.jsp login1.action(跳转到登录页面) /** 跳转到login(有积分排 ...
- springboot整合mybatis,redis,代码(三)
一 说明 接着上篇讲述redis缓存配置的用法: 二 正文 首先要使用缓存就必须要开开启缓存,第二步是需要开redis-server 下载redis包之后,点击图中两个都可以开启redis 怎么看是否 ...
- anglarJs分页
首先在页面引入分页插件 <script src="../plugins/angularjs/pagination.js"></script> <lin ...
- HashMap 1.8的源码分析一
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...
- spring boot 加载配置 文件
在springboot启动的过程中,默契情况下会在classpath路径下加载application.properties当做系统配置文件,但有时候我们想要替换成另一个文件,可以 通过以下方式: ...