MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式,

现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若能够将两者结合起来使用,

将会使程序运行速率提高很多倍的。

由于MEX的实质在windows的下面就是dll 即动态链接库,因而可以采用 VC++来作为开发和调试 MEX文件的工具。

下面是具体的使用VC++ 6.0 生成一个 可以由Matlab 软件可以运行的MEX的 操作步骤,

1. 首先,通过VC++创建一个 Win32 Dynamic-Link Library ,建立一个动态的链接库工程

2. 接下来在弹出的 窗口中 选择 An empty DDL project ,即创建一个 空的动态链接库,

3. 再点击 【完成】 之后,在工作路径中 添加两个文件 :

3.1 工程名.c , 在本实验中 对应的是 myMexVcTest.c

它的作用就是,在C 程序中加载相关的MEX文件,并指定在mexFunction 中实现相关的方法。

mexFunction 的方法参数头 是固定的,下面的代码是 一个空的mexFunction 所实现的模板。

//myMexVcTest.c

#include "mex.h"
void mexFunction ( int nlhs, mxArray *plhs[] , int nrhs , const mxArray *prhs[] )
{
printf("Hello World\n") ;
mexPrintf("Hello World\n") ;
}

  3.2 工程名.def  在本实验中对应的 是 myMexVcTest.def

这个文件中所实现的功能就是 告诉编译器建立的是 一个叫做 myMexVcTest.mexw32 的文件,

并且其导出 参数是mexFunction。

LIBRARY 	myMexVcTest
EXPORTS mexFunction

  

在完成了在目录下面创建这两个文件之后,还要通过VC++6.0 中的,Project(工程)->Add To Project (添加到工程) 菜单项将其加入到

已经建立的 VC工程中。

4. 接下来,要进行的是 将系统中的 matlab.exe 路径告知 VC++,以及 在编译的时候,将相关需要的lib

文件加载到下相应的路径中去。

4.1 告知 VC++ 6.0 matlab.exe 所在的路径,

<这里需要注意一下,由于 VC++ 6.0 所对应的版本是 win32,

为了保证二者 的兼容性,建议 即便是64位的操作系统,也要在安装的时候,将安装的Matlab的版本设定为 win32 版本的,

这样在混合编程的时候,可以避免很多的麻烦。>

4.1.1 首先,需要在工程中,选择设置

4.1.2 然后,在弹出的对话框中的,可执行对话框中选定 browse ,然后,将 matlab所在的主目录下面的 /bin/matlab.exe 选中即可。

4.1.3 接下来从 【Project Setting】 (【工程】-> 【设置】) 对应的 弹出窗体中,

从 【调试 】换到 【C/C++】 选项,在 预处理程序定义 ( Preprocessor definitions :)

中添加 MATLAB_MEX_FILE 并且用 逗号 将其与前面的字段进行分割

4.1.4 接下来,将 【C/C++】切换到 了【链接/Link】选项,在 【输出文件名/ Output file name 】 下面的文本框中, 将 *.dll 更改成 *.mexw32,

当然,如果你的matlab 是64bit 的话, 要更改为 *.mexw64 。

同时, 将 【对象/库 模块/ Object/library modules :】 下面的 文本框中 添加 libmx.lib libmex.lib libmat.lib 这些lib文件,

并且 ,不要忘了 使用空格 是他们之间保持 间隔。

4.1.5 接下来,选择 【工具/Tools】 -> 【选项/options】

  选择 【目录/Directories】

  1. 首先,在 【目录/Show directories for :】 选择 Include files

  在 【目录/Directores】 中添加 matlab 目录下面的  1.1  <matlab>\extern\include 和 1.2  <matlab>\extern\include\win32

  2.然后,在 【目录/Show directories for :】 选择 Library files

  在 【目录/Directories】 中添加 matlab 目录下面的 <matlabroot>\extern\lib\win32\microsoft

进行上述的一些列配置之后,就可以 运行文件了,在成功编译之后,就会在Debug 的目录下面找到一个 名称叫做

*.mexw32的程序,如果 单击运行的 按钮的话,就会显示出 matlab 的工作区的界面了。

在生成 *.mex32的程序之后,相关的调用问题也是很重要的,

那么,如何在matlab 中调用 生成的混合编程的 *.mex32 呢?

是这个样子的, 将你的matlab 的工作目录 切换到 工程目录之下,

你在VC++ 6.0 中创建的 工程的名称 应该是 与你添加到 工程中的 *.c 文件的名称 是一致的,

所以,在生成 *.mex32 文件 之后 ,你的工程名 就会被 matlab 当做是一个 可自行的函数的名字,

所以,比如说 LZ 所创建的工程名称 = .c 文件的名称 即 在matlab 中会把 myMexVcTest 当做是一个 函数的名称,

而函数的参数值 是通过 mexFunction 的相关参数 所对应的缓冲区 进行 传入的。

也就是说,在matlab 中 将路径 切换到,工程路径后,输入 : >>myMexVcTest 之后,将会调用其中 的方法,

因为,LZ实现的方法 是很简单的, 并没有涉及到 参数的传递,所以 无需 写成 myMexVcTest( args....)的形式。

如果,需要传入两个 int 类型的参数,并且也有 返回值的话, 可以这样写:

>> res = myMexVcTest( 20, 34 ) ;

截图如下:

其中, 显示的两个Hello World 一个是 通过 C语言的, printf (“Hello World\n”) ; 输出到 控制台上进行显示的,

而另一个 是  mexPrintf("Hello World\n")  通过,mex的相关调用而生成的 文字打印。

在 LZ 的下一个 mex 编程中, LZ将会 使用 C++ 语言实现一个 树的数据结构 及其算法的 实现,

然后 通过mexFunction 方法 向相应的方法中传递相关的参数。

如何在VC++ 中调试MEX文件的更多相关文章

  1. 如何在IDEA中调试 Jar文件

    原创文章,转载请注明出处:http://www.cnblogs.com/acm-bingzi/p/6668333.html   问题: 一般情况下,可以打成Jar包的项目,它的源码运行Applicat ...

  2. 如何在sublime中调试html文件

    一.安装View In Browser插件 快捷键 Ctrl+Shift+P(菜单栏Tools->Command Paletter),输入 pcip选中Install Package并回车,输入 ...

  3. vs调试MEX文件

    http://www.cnblogs.com/lukylu/p/4042306.html matlab里面无法单步调试mex函数,故需转到VS上面调试,这里采用VS2010. 参考网上很多人写的方法但 ...

  4. 如何在xampp中运行php文件 (WINDOWS)

    from:http://blog.sina.com.cn/s/blog_5e87822501011os2.html 入门: 如何在xampp中运行php文件 (WINDOWS) 安装XAMPP启动ap ...

  5. 如何在C#中调试LINQ查询

    原文:How to Debug LINQ queries in C# 作者:Michael Shpilt 译文:如何在C#中调试LINQ查询 译者:Lamond Lu 在C#中我最喜欢的特性就是LIN ...

  6. 转 Visual C++6.0 与matlab联合编程(2)----Visual C++6.0 环境下编译和调试MEX文件

    我的最初想法是利用matlab的mex命令调用C++程序生成动态链接库的,但是测试程序(文中另附)通过了,自己的实际应用程序却没有过.还是把方法贴在这儿,以便自己以后进行整理. http://shij ...

  7. Qt Creator下应用CMake项目调试mex文件

    网上可以找到很多应用Visual Studio编写.编译mex文件,并与MATLAB联合调试的文章.但这只限于Win平台,网上许多源码都是.mexa64的文件,它们的作者是怎么调试的呢?这里我介绍一下 ...

  8. 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目. 在Cocos2d-x被整合到Cocos引 ...

  9. 如何在VC中查询中文,及QT5的中文处理

    1,VC中查询所有含中文字符串 使用正则表达式,查询内容为: (".*[\u4E00-\u9FA5]+)|([\u4E00-\u9FA5]+.*") 这样,就可以把代码中的中文都查 ...

随机推荐

  1. POJ 2249

    #include<stdio.h> longlong sum; int main() { int k,n,m; while(~scanf("%d%d",&n,& ...

  2. Jmeter初步使用二--使用jmeter做一个简单的性能测试

    经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍 ...

  3. Java笔记(十)……面向对象II封装(Encapsulation)

    封装概念 封装: 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离. 便于使用. 提高重用性. 提高安全性. 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性都隐藏,提 ...

  4. CodeForces 362B Petya and Staircases

    题意:一个小男孩要上楼梯,他一次可以走1个台阶或2个台阶或3个台阶,但是有一些台阶是脏的,他不想走在脏台阶上.一共有n个台阶和m个脏台阶,他最开始在第1个台阶上,要走到第n个台阶.问小男孩能不能不踩到 ...

  5. 动态加载JS脚本的4种方法

    实现OPOA(One Page One Application)时,必须使用动态加载js. 也就是在用户选择某个菜单项后,再动态加载对应的全部js到客户端. 动态加载js的情况很多啊,比如解决ajax ...

  6. Xamarin开发Android时Visual Studio 2012没有智能提示解决办法

    Most of the people who work with Xamarin’s Mono for Android in Visual Studio 2012 face a bug where I ...

  7. YII访问数据库

    YII访问数据库 CDbConnection: 一个抽象数据库连接 CDbCommand: SQL statement CDbDataReader: 匹配结果集的一行记录 CDbTransaction ...

  8. StreamWriter

    public StreamWriter( string path, bool append ) 参数 path 类型:System.String要写入的完整文件路径. append 类型:System ...

  9. The Dangers of JavaScript’s Automatic Semicolon Insertion

    Although JavaScript is very powerful, the language’s fundamentals do not have a very steep learning ...

  10. hdoj 1242 Rescue

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...