在Matlab中调试用C编写的MEX文件
- 格式:doc
- 大小:29.00 KB
- 文档页数:2
MATLAB调用C++动态库的方法声明:本人知识水平有限,文档中难免有错,望谅解!一、方法步骤1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。
2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),其实,这个文件起转换作用。
也就是说,你用MATLAB调用C++动态库就必须通过这个文件去调用,而这个文件就是由.cpp文件生成的。
这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下:void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])nlhs:输出参数个数plhs:输出参数列表nrhs:输入参数个数prhs:输入参数列表不过函数名可以随便取的。
在这个函数中你就可以去调用C++动态库的函数了。
记住头文件:”mex.h”……注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。
3、使用mex命令编译XXX.cpp。
如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64文件。
这个文件的文件名就将是你要调用的函数名;4、现在就可以写脚本调用这个函数了。
二、案例1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数double Demo_Add( double x, double y); //功能:将两个数相加并返回这些大家都知道,不用我说了吧。
2、在MATLAB中写一个c++文件Test.cpp:#include "mex.h"#include "Demo.h"#pragma comment(lib,"Demo.lib")void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){if( nrhs != 2) //判断输入参数的个数{mexErrMsgTxt("输入参数个数不对!");}//得到传入的第一个参数,并转换了double类型double p1 = *((double*)mxGetPr(prhs[0]));//得到传入的第二个参数,并转换了double类型double p2 = *((double*)mxGetPr(prhs[1]));//创建一个1*1的实时double类型的矩阵plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);//得到输出的第一个参数的指针double *output = (double*)mxGetPr(plhs[0]);//调用Demo.dll定义的函数实现功能,并将返回值给输出参数*output = DEMO_Add(p1, p2);}3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32或者Test.mexw64.5、那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.我现在就写一个脚本文件First.m:clcclearticx = 1.6;y = 2.7;Test_add = Test(x, y)toc6、run这个脚本.MATLAB调用C++动态库就成功了….Author : Li JunDate :2012-03-26。
MATLAB 编译MEX文件的方法2010-10-07 11:22:23| 分类:默认分类| 标签:|字号大中小订阅通过MEX文件可以在MATLAB中像调用内嵌函数一样调用现有的使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能解决MATLAB循环效率低的缺点,提高MATLAB环境中数据处理的效率。
MEX文件的后缀名为.mexw32MEX文件的编写和编译需要两个基本条件:一是必须按照MATLAB应用程序接口组件和相关工具,二是要有C语言或Fortran语言的编译器。
需要对MATLAB系统进行设置,使MATLAB系统知道使用系统的哪一个C语言编译器,以及其参数和路径。
MEX文件系统设置:>> mex –setup 按照提示进行,最后出现Done…系统配置完毕。
C语言MEX文件的建立C语言MEX文件的建立1.MEX文件的结构a)计算子程序b)入口子程序,void mexFunction(int nlhs, mxArray *plhs[],int nrhs,constmxArray *prhs[]) { /*用户特定的代码….*/ }2.创建timestwoalt.c#include "mex.h"void timestwo_alt(double *y, double x){*y = 2.0*x;}void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ){double *y;double x;/* 检查参数*/if (nrhs != 1) {mexErrMsgTxt("One input argument required.");} else if (nlhs > 1) {mexErrMsgTxt("Too many output arguments.");} else if (!mxIsNumeric(prhs[0])) {mexErrMsgTxt("Argument must be numeric.");} else if (mxGetNumberOfElements(prhs[0]) != 1 || mxIsComplex(prhs[0])) { mexErrMsgTxt("Argument must be non-complex scalar.");}/* 为输出参数创建变量*/plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);/*为参数x、y赋值,x为值,而y为指针(由于MATLAB没有值传递,所以用指针才能得到修改后的y值,不然修改的是y的一个副本,为临时变量,在函数返回时,y值没有变化,不能得到希望的结果)*/x = mxGetScalar(prhs[0]);y = mxGetPr(plhs[0]);/* 调用timestwo_alt 子函数*/timestwo_alt(y,x);}3.编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mextimestwoalt.c生成一个名为timestwoalt.mexw32的MEX文件4.运行:在MATLAB的控制窗口中输入x=2;y=timestwoalt(x)输出:y=4MEX文件实现了一种C语言与MATLAB的接口,其实际的计算功能仍在C语言形式的计算子程序中完成,而入口子程序的功能是检查参数以匹配C语言的参数规范(how to?)。
MATLAB MEX文件反编译1. MEX文件是什么?在MATLAB中,MEX文件是一种用C、C++或Fortran语言编写的可调用函数,可以与MATLAB代码进行交互。
MEX文件可以提高MATLAB代码的执行效率,因为它们可以使用底层语言编写,从而利用底层硬件和操作系统的特性。
2. MEX文件的应用场景MEX文件通常用于需要高性能计算的任务,如图像处理、信号处理、数值计算等。
通过编写MEX文件,用户可以在MATLAB中使用其它编程语言的特性,提高程序的运行效率。
3. MEX文件的反编译MEX文件一直以来都是MATLAB用户关注的话题,因为MEX文件的源代码通常是关闭的,无法直接获取。
但是有时候,我们可能需要查看MEX文件的源代码,以便了解其实现原理或修改其功能。
这就需要进行MEX文件的反编译。
4. 反编译的方法实际上,MEX文件的反编译是一项复杂的任务,因为MEX文件是经过编译的二进制文件,包含了底层语言的机器码。
常见的反编译方法有静态分析和动态分析两种。
静态分析通常是通过逆向工程的方式来尝试还原MEX文件的源代码,而动态分析则是在运行时监视MEX文件的行为,并从中获取相关信息。
5. 静态分析的挑战静态分析的挑战在于理解MEX文件的结构和机器码对应关系。
由于MEX文件的编写语言多样,其结构也各不相同,这就给静态分析带来了很大的挑战。
编译器优化和加密技术也会使得静态分析变得更加困难。
6. 动态分析的优势相比之下,动态分析的优势在于能够直接观察MEX文件的运行时行为,从而获取到更加直观和准确的信息。
动态分析可以利用调试器、虚拟机监视器等工具来动态跟踪MEX文件的执行流程和内存访问情况,从而逐步还原其源代码。
7. 我的观点个人认为,尽管MEX文件的反编译技术存在一定的挑战,但随着逆向工程技术的发展和成熟,我们有望在未来找到更多有效的方法来进行MEX文件的反编译。
MATLAB官方也在不断加强对MEX文件的保护措施,以防止源代码的泄露和篡改。
在Visual C++中建立MEX文件及调试在Matlab环境中可以方便的编辑MEX文件,而编译MEX文件只要一句mex命令,所以一般不需要VC++环境来建立MEX文件。
但对于大型的MEX 程序,可能会比较复杂,容易出错,这时可以利用Visual C++强大的调试功能。
下面通过一个简单的例子说明如何在Visual C++中建立及调试的步骤。
问题:在Visual C++中建立MEX文件,功能是在Matlab控制窗口中输出“Hello Matlab World”1. Visual C++中MEX文件的建立(1) 建立DLL工程在Visual C++中创建一个MFC DLL工程,命名为MexDemo,如图1所示图1 创建MFC DLL工程(2) 设置输出函数打开MFC DLL工程中的MexDemo.def文件,需要在其中定制DLL文件的输出函数,在def文件中的EXPORTS项中添加mexFunction一行,设置后,MexDemo.def文件内容如图2所示:图2 MexDemo.def文件内容(3) 添加应用程序代码在工程中新建一个C++源文件,命名为main.cpp,将该文件添加到工程的源文件中,功能是输出一行"Hello Matlab World!"。
如图3和图4所示:图3 添加main.cpp文件图4 main.cpp文件内容(4) 编译器设置因为C++文件中含有Matlab的库函数,要在Visual C++中成功编译此类MEX 文件的话要对编译器做一些必要的设置,下面以Microsoft Visual C++ 6.0为例做如下设置。
添加include 路径打开“Project setting”→“C/C++”→“Preprocessor”→“Additional include directories”,添加Matlab外部接口的include目录,本机为"I:\Program Files\MATLAB\R2007b\extern\include"。
Vs2015联合matlab2016b生成.mexw64文件2017.12最近要用C-mex文件,搜索了好几天在网上没有发现有用的资料,要么资料太旧,使用不了,最终在matlab帮助文档和国外的网站论坛上求助最终后成功。
在此要特别强调,遇到问题的第一件事是去查帮助文档,而不是search。
耐下心去看英文文档,真正高深的有用的基本上在帮助文档里面都有解释。
实在解决不了的去论坛上提问,高手还是很多的。
最后程序也可以在Codeblocks上运行生成,感谢外国友人的帮助,有时间的话会写一篇关于Codeblocks上运行生成mexw64文件的文章。
有想知道了解的可以私信我。
一、Matlab和IDE混合编程的方法有以下几种:1、matlab调用由IDE编译出来的mex文件(相当于动态链接文件,这一点相当重要,不要使用生成控制台程序,这一点一错,后面都不用看了),老版本的mex文件后缀是.dll,新版本的mex文件后缀是.mexw32/64(根据版本生成)。
2、IDE通过engine调用matlab文件。
以上两种方法matlab帮助文档写的都包括,这种只详细讲第一种方法。
二、使用的平台是matlab2016b 64位和VS2015社区版。
(把下面所述的项目,C文件名称全部改为arrayProduct)1、新建一个项目,选择win32/win32项目(可用于创建DLL和静态库项目),不是选择的win32控制台应用程度。
下面输入位置名称等,下一步选择程度类型为DLL,设置一个空项目2、然后生成解决方案如图所示在源文件里面添加一个C文件,或者已有的C文件。
因为matlab是64位,所以调试工具也要选择X643、在源文件里面新建一个模块定义文件.def,文件的名称与项目,C文件名称一致。
添加内容如下4、设置项目属性:1、平台是X64,在配置属性里面的目标扩展名更改为:.mexw642、在C/C++常规项里的附加包含目录是设定:C:\Program Files\MATLAB\R2016b\extern\include这个里面包含的应该是VS所需要调用的matlab的头文件。
Matlab中mcc, mbuild和mex命令详解MATLAB编译及接口Matlab的mcc命令将m文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编译器)和exe文件,并在特定条件下可以自动调用mbuild或者mex。
Mex命令将入口函数为mexfunction()的C/C++文件编译成MEX(DLL)文件(需要C/C++编译器)。
Mbuild命令将入口函数为main()的C/C++文件生成可独立运行的C应用程序(需要C/C++编译器)。
对于64位的Windows平台,MATLAB没有现成的C编译器。
需要免费下载Microsoft Windows SDK编译器。
Microsoft Windows SDK for Windows 7 and .NET Framework 4下载地址:(需要联网安装):microsoft/en-us/download/details.aspx?id=8279安装前一定要卸载Microsoft Visual C++ 2010 x86 Redistributable - 10.0.30319以上版本的C++运行库,装完SDK7.1后需要安装VC-Compiler-KB2519277补丁::microsoft/zh-cn/download/details.aspx?id=4422 在使用mcc, mbuild和mex命令之前,首先要配置MATLAB使用Windows SDK进行C/C++语言编译,配置命令如下:mex -setup17mbuild -setup配置命令运行结果:>> mex -setupMEX 配置为使用'Microsoft Visual C++ 2012 (C)' 以进行C 语言编译。
警告: MATLAB C 和Fortran API 已更改,现可支持包含2^32-1 个以上元素的MATLAB 变量。
不久以后,您需要更新代码以利用新的API。
Mex的编写方法1、Mex的介绍MEX文件的调用极为方便,其调用方式与MATALAB的内建函数完全相同,只需要在命令窗口内输入对应的文件名称即可。
写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。
编写MEX 程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等(本文将会分别介绍这两种编写方法)。
用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试。
如用VC即可编译也可调试,比较方便。
mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写和调试dll,就会用VC编写和调试MEX程序。
1.1、MEX文件格式#include "mex.h"voidmexFunction( intnlhs, mxArray *plhs[],intnrhs, constmxArray *prhs[] ){}四个参数分别用来输出和输入数据: nrhs、nlhs是输入、输出参数个数,prhs、plhs是输入、输出参数指针。
注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。
(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。
MATLAB可以通过这些指针,访问内存中的数据。
)1.2、操作输入数据对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。
mxGetM 和mxGetN 得到矩阵数据的行和列(返回整数)。
对于实矩阵,我们可以定义double *M; 来对实矩阵数据操作。
如:double *M;intm,n;// 指针指向第一个参数的数据地址M = mxGetPr(prhs[0]);m = mxGetM(prhs[0]);n = mxGetN(prhs[0]);需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"的,这点和Fortran是一样的。
在Matlab 中调试用C/C++编写的MEX 文件(32、64位机,VS2005和matlab
R2010b)
mex文件是matlab提供的与外部语言如C、C++提供的接口函数。
可以在Matlab环境下编写一个*.m文件,来编译所定的C/C++文件,当然,这个C/C++文件的开头是有要求的。
Mex函数有固定的自己的一套接口形式
以VS2005和matlab R2010b 7.11.0版本为例,C/C++文件在matlab编译格式为*.mexw32,准备好你的C/C++文件后:
[1]、matlab安装mex编译工俱
命令如:mex –setup
编译工具选择:VS2005;一路yes下来。
最后,只要不报错就可以。
[2]、在matab环境中,编写编译文件compile_mex .m
把C/C++文件编译成*.mexw32文件时,要使用mex –g命令,产生具有调试信息的执行文件。
而不是mex –o命令,后者是不含调试信息的。
compile_mex.m 文件内容如下;
function compile_mex(debug_flag)
if strfind(computer(),'64')
defs = '-DA64BITS '; % for 64bit machines - define pointer type else
defs = '';
end
if verLessThan('matlab','7.3')
defs = [defs, '-DmwIndex=int -DmwSize=size_t '];
end
if nargin>0 && debug_flag
debugs = ' -g ';
sprintf('mex -g');
else
debugs = ' -O ';
end
cmd = sprintf('mex %s -largeArrayDims %s filename.cpp ', debugs, defs); eval(cmd);
在命令行执行:
debug_flag =’1’, compile_mex(debug_flag)
生成了:filename .mexw32和filename.mexw32.pdb;
如果不需要产生调试信息:
在命令行做无参数执行:
compile_mex
生成了:filename .mexw32,但没有生成filename.mexw32.pdb;
[3]、确定matlab打开。
[4]、VS2005设置:
打开VS2005,而后打开*.mexw32所对应的C/C++文件,不用建立新的工程。
找到“调试”或“工具”下拉项:attach to processor(附加到处理器),选择matlab.exe进程,确定即可。
此时可以看到VS2005是处于运行状态的。
在C/C++文件中,就你所关心的程序处设置断点。
[5]、打开matlab下要运行的程序,先在matlab调用*.mexw32文件的那个地方设个观察断点。
运行matlab程序。
[6]、matlab先停在你的matlab调用处,再继续执行程序。
自动跟到VS2005中设定的断点。
(自动从matlab跟入VS2005),可以使用单步,逐步,跳出等调试手段,还可以把变量添加到观察窗口,和VS2005下的操作雷同。
但不具备所有功能。
[6]、*.mexw32文件,*.mexw32.pdb文件和C/C++源文件,*.m文件最好都放在一个文件夹下。