最近由于项目需求,某项目的算法是基于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手动安装配置mysql5.6

    1.准备工作 ①官网下载:https://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载之后上传到服务器. ②创建linux组用户 groupa ...

  2. passing parameter to an event handler [stackoverflow]

    Q: i want to pass my List<string> as parameter using my event public event EventHandler _newFi ...

  3. linux虚拟机与windows主机传输文件方法

    通过ssh    这种方法需要虚拟机内的linux安装ssh服务,默认是安装的。 首先检查ssh服务是开启的,通过shell下执行命令:service ssh status, 查看ssh服务是否已开启 ...

  4. Struct结构体

    1.结构体的定义与调用 // 定义结构体类型 // 结构体类型名为 MyDate1 struct MyDate1 { int year; int month; int day; }; // 定义结构体 ...

  5. 【阿圆实验】Alertmanager HA 高可用配置

    注意:没有使用supervisor进程管理器的,只参考配置,忽略和supervisor相关命令.并且alertmanager的版本不得低于0.15.2,低版本alert不支持集群配置. 一.alert ...

  6. yyyyMMdd必须严格遵守大小写规范

    c#中ToString("yyyyMMdd") 与ToString("yyyymmdd")区别 string a= DateTime.Now.ToString( ...

  7. P2105 K皇后

    题意:$n*m$棋盘放置k个皇后,问几个格子不被攻击 1≤n,m≤20000,1≤k≤500 开set判重暴力$O(n*k)$然而,setMLE了QAQ 正解确实是$O(n*k)$的 以hang[i] ...

  8. 「产品经理全连接系列2」企业如何开展敏捷或DevOps的研发变革

    大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...

  9. [国家集训队]happiness 最小割 BZOJ 2127

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  10. Gradle 引入本地定制 jar 包

    第 1 步:创建文件夹,拷贝 jar 包 在自己的 Gradle 项目里建立一个名为 “libs” (这个名字可以自己定义,不一定非要叫这个名字)的文件夹,把自己本地的 jar 包拷贝到这个文件夹中. ...