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. 转载--C++ STL

    转自:http://wenku.baidu.com/view/15d18b4533687e21af45a9a4.html 1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec ...

  2. 2015年9月28日JQuery提前预习预热笔记

    visual studio下载2010 2010与2008不一样,2008需要添加补丁,采用调用对象.2010可以直接用. JQuery=$ 是函数是方法是对象 念J快儿,念doler 开发人员工具( ...

  3. qosort 使用使用小例子

    输入 1500 3150 300100 200 输出结果470 471100    200150    300470    471     #include <iostream> #inc ...

  4. bzoj 2282 [Sdoi2011]消防(树的直径,二分)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

  5. 【Java基础】Java类及成员和修饰符的关系

    修饰符的分类 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 类的修饰符 权限修饰符:默认修饰符,public ...

  6. HW1.3

    public class Solution { public static void main(String[] args) { System.out.println(" J A V V A ...

  7. HW1.6

    public class Solution { public static void main(String[] args) { System.out.println("1 + 2 + 3 ...

  8. Jetty 8长连接上的又一个坑

    Jetty 8 长连接的超时断开连接的机制:超时连接机制针对IO传输过程中的数据阻塞时间超过一定阈值时,断开该连接.阻塞指当前处于数据传输阶段,但是连续指定时间内都没有发出或者接收到任何数据时,Jet ...

  9. YII2安装中遇到的错误解决Calling unknown method: yii\web\UrlManager::addRules()

    安装好YII2 后出现 例如以下图错误提示: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenF0c3g=/font/5a6L5L2T/fontsize/ ...

  10. Android代码中动态设置图片的大小(自动缩放),位置

    项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android=&qu ...