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位,所以调试工具也要选择X64
3、 在源文件里面新建一个模块定义文件.def,文件的名称与项目,C文件名称一致。
添加内容如下
4、 设置项目属性:
1、 平台是X64,在配置属性里面的目标扩展名更改为:.mexw64 2、 在C/C++常规项里的附加包含目录是设定:
C:\\Program Files\\MATLAB\\R2016b\\extern\\include
这个里面包含的应该是VS所需要调用的matlab的头文件。 3、在C/C++预处理器定义里面加入: MATLAB_MEX_FILE
不知道起什么作用,帮助文档里面这样要求的,网上搜索的都没这项。 4、在链接器/常规里面输出文件定义为: ap.mexw64
文件名为项目名/C文件名,所有名称保持一致 5、在链接器/常规/附加库目录时定义;
C:\\Program Files\\MATLAB\\R2016b\\extern\\lib\\win64\\microsoft 这里应该是链接器寻找动态文件(第6项)的目录。 6、在链接器/输入里面定义: libmx.lib;libmex.lib;libmat.lib;
这是按照matlab帮助文件写的,中间要加;网上搜索的有的要加入libeng.lib, 还有的说中间不能加;只能回车。
7、因为之前添加的模块定义文件,所以在链接器/输入里面的模块定义文件里面自
动生成了ap.def。如果是添加的,此外应该定义添加的文件名。
这里应该是VS链接文件时所要用到的动态文件
这样在VS里面的设置就完成了,点击生成文件,成功后在ap/ap文件夹里面可以找到生成的ap.mexw64文件,然后把这个文件copy到MATLAB的目前目录下(不能新建文件夹),这样就可以在matlab工作窗口时行调试了。
附上C源代码:
/*========================================================== * arrayProduct.c - example in MATLAB External Interfaces *
* Multiplies an input scalar (multiplier) * times a 1xN matrix (inMatrix) * and outputs a 1xN matrix (outMatrix) *
* The calling syntax is: * * *
* This is a MEX-file for MATLAB.
* Copyright 2007-2012 The MathWorks, Inc. *
*========================================================*/
#include\
/* The computational routine */
voidarrayProduct(doublex, double *y, double *z, mwSizen) { mwSizei;
/* multiply each element y by x */ for (i=0; i /* The gateway function */ voidmexFunction( intnlhs, mxArray *plhs[], intnrhs, constmxArray *prhs[]) { double multiplier; /* input scalar */ double *inMatrix; /* 1xN input matrix */ size_tncols; /* size of matrix */ double *outMatrix; /* output matrix */ /* check for proper number of arguments */ outMatrix = arrayProduct(multiplier, inMatrix) if(nrhs!=2) { mexErrMsgIdAndTxt(\,\); } if(nlhs!=1) { mexErrMsgIdAndTxt(\,\); } /* make sure the first input argument is scalar */ if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || mxGetNumberOfElements(prhs[0])!=1 ) { mexErrMsgIdAndTxt(\,\scalar.\); } /* make sure the second input argument is type double */ if( !mxIsDouble(prhs[1]) || mxIsComplex(prhs[1])) { mexErrMsgIdAndTxt(\,\double.\); } /* check that number of rows in second input argument is 1 */ if(mxGetM(prhs[1])!=1) { mexErrMsgIdAndTxt(\,\); } /* get the value of the scalar input */ multiplier = mxGetScalar(prhs[0]); /* create a pointer to the real data in the input matrix */ inMatrix = mxGetPr(prhs[1]); /* get dimensions of the input matrix */ ncols = mxGetN(prhs[1]); /* create the output matrix */ plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL); /* get a pointer to the real data in the output matrix */ outMatrix = mxGetPr(plhs[0]); /* call the computational routine */ arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols); } C代码的目的是计算一个标量和一个向量的乘积。 调用格式为:矩阵=arrayProduct(标量,1*n的矩阵) 附上matlab帮助文档: