最近由于项目需求,某项目的算法是基于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 混合编程的更多相关文章

  1. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

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

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  3. matlab和C/C++混合编程--Mex (六)参数传递

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  4. matlab和C/C++混合编程--Mex (转载)

    matlab和C/C++混合编程--Mex 最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续 ...

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

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...

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

    最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...

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

    [转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数. ...

  8. matlab + c/c++ opencv 混合编程

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

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

    如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...

随机推荐

  1. Linux curl 常用命令

    命令:curl在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. ...

  2. Javascript-DOM笔记

    参考 javascript原生dom操作方法 JavaScript原生的dom操作方法 第一类:节点查找相关方法和属性 document/父节点.getElementById()document/父节 ...

  3. duddo在xml里面出现红叉的解决方法

    原因是没有加入dubbo.xsd window-Preferences-输入xml-xmltacalog....... 配置离线约束:http://code.alibabatech.com/schem ...

  4. 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机

    [bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...

  5. Xml Helper

    类的完整代码: using System;using System.Collections;using System.Xml; namespace Keleyi.Com.XmlDAL{public c ...

  6. P2700 逐个击破

    题意:现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的, 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K ...

  7. Qt 学习之路 2(25):画刷和画笔

    Home / Qt 学习之路 2 / Qt 学习之路 2(25):画刷和画笔 Qt 学习之路 2(25):画刷和画笔  豆子  2012年11月5日  Qt 学习之路 2  17条评论 前面一章我们提 ...

  8. laytpl....

    switch 语句.. <ul class='mui-table-view'> <!--switch 语句 ...--> {{# switch(d['event']){ cas ...

  9. C语言中变量的存储类型

    在C语言中,对变量的存储类型说明有以下四种: auto 自动变量register   寄存器变量extern 外部变量static   静态变量 自动变量和寄存器变量属于动态存储方式,外部变量和静态变 ...

  10. 在word2010中添加带滚动条的文本框

    由于文件内容过长,为了加强文章的可读性,可以添加一个带滚动条的文本框,既能使文章看起来干净整洁,同时也极大的提高了文章的可读性. 我这里对在word2010中文本框带滚动条作个介绍: 1. 打开wor ...